泛型的約束理解

2021-07-26 19:35:36 字數 2827 閱讀 2465

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 型別引數必須是值型別。可以指定除...