1.引用型別約束
struct refsamplewhere t:class 引用型別用class表示約束,其他的引用型別為具體的約束。
表示對於的約束必須為乙個類(引用型別)不能是值型別(int,char,datatime,struct),可以是介面inte***ce
區分,陣列為引用型別,因為定義陣列時需要new出乙個物件。
雖然定義成 refsample傳入的必須為引用型別 但是refsample仍然為值型別
2.值型別約束
class valsamplewhere t:struct
為引用型別,因為int,char等型別都是struct
valsample
3.建構函式型別約束
public t createinstance() where t:new()
指定的型別t必須有建構函式,createinstance和createinstance都是有效的。但是createinstance沒有建構函式。
4.轉換型別約束
一種約束允許你指定另乙個型別,型別實參必須可以通過一致性、引用或裝箱轉換隱式地轉換為該型別。你還可以規定乙個型別實參必須可以轉換為另乙個型別實參——這稱為型別引數約束。
理解的意思:可以互換,就是我們可以通過裝箱或者強制型別轉換成目標型別的 型別都可以用於型別引數傳入。
class samplewhere t:stream
有效:sample這本身符合約束
無效:sample因為string型別無法通過引用或者裝箱拆箱強制轉換成stream、
struct samplewhere t:idisposable
規定t必須為idisposable 型別的 引用型別
有效:sample引用轉換
無效:sample
分析:為什麼sqlconnection 可以而stringbuilder不可以?它們都是引用型別
1.sqlconnection實現了idisposable介面,所以可以協變
2.stringbuilder只實現了iserializable介面,無法通過途徑轉換為idisposable
因為將icomparable整體當作約束,分析icomparable的型別,可以用type.isvaluetype判斷,true為值型別,false為引用型別
typeof(icomparable).isvaluetype 結果為false表示為引用型別
有效:sample(裝箱轉換)
無效:sample
也可以指定多種約束:
class samplewhere t:stream,ienumerable,icomparable
class samplewhere t:u
有效:sample
無效:sample
總結:要看傳入類引數是否可以轉換,檢視規定引數和傳入類引數是否實現同一介面,如果實現則可以,否則不可以。
不可以是以下:system.object,system.enum,system.valuetype,system.delegate,結構或密封類(string)
5.組合約束
對型別引數的約束有多個,注意:只能是一種型別,值型別和引用型別不能同時存在,沒用乙個型別即是引用型別,又是值型別。
由於每乙個值型別都有乙個無建構函式,此後不能再有建構函式約束
有效:class samplewhere t:class,idisposable,new()
class samplewhere t:stream where u:idispsable
無效:class samplewhere t:class,struct (沒有任何型別即時引用型別又是值型別的,所以為無效的)
class samplewhere t:stream,class (引用型別約束應該為第乙個約束,放在最前面,所以為無效的) stream只是約束傳入引數為stream具體型別,而class約束為引用型別,一開始我理解錯了
class samplewhere t:new(),stream (new() 必須放在最後)
class samplewhere t:idisposable,stream (類必須放在介面前面,所以為無效的)
class samplewhere t:xmlreader,icomparable,icomparable (對於轉換型別約束,同乙個介面不能出現多次)
class samplewhere t:struct where u:class,t (型別形參「t」具有「struct」約束,因此「t」不能用作「u」的約束,所以為無效的)
class samplewhere t:stream ,u:idisposable 語法錯誤
看到網上還有這種版本也是有效的我表示不理解:
class samplewhere t:struct,idisapsable idisapsable為值型別?
class samplewhere t:class where u:struct ,t t為引用型別為何與值型別一起約束u?
希望可以指正
泛型的約束理解
1.引用型別約束 struct refsamplewhere t class 引用型別用class表示約束,其他的引用型別為具體的約束。表示對於的約束必須為乙個類 引用型別 不能是值型別 int,char,datatime,struct 可以是介面inte ce 區分,陣列為引用型別,因為定義陣列時...
泛型的約束理解
1.引用型別約束 struct refsamplewhere t class 引用型別用class表示約束,其他的引用型別為具體的約束。表示對於的約束必須為乙個類 引用型別 不能是值型別 int,char,datatime,struct 可以是介面inte ce 區分,陣列為引用型別,因為定義陣列時...
c 泛型約束
在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定的。下表列出了六種型別的約束 約束說明 t struct 型別引數必須是值型別。可以指定除...