C 泛型的約束

2022-09-26 04:39:11 字數 2620 閱讀 6250

1.引用型別約束

struct refsample where t:class         引用型別用class表示約束,其他的引用型別為具體的約束。

表示對於的約束必須為乙個類(引用型別)不能是值型別(int,char,datatime,struct),可以是介面inte***ce

區分,陣列為引用型別,因為定義陣列時需要new出乙個物件。

雖然定義成 refsample 傳入的必須為引用型別 但是refsample仍然為值型別

2.值型別約束

class valsample where t:struct

為引用型別,因為int,char等型別都是struct

valsample

3.建構函式型別約束

public t createinstance() where t:new()

指定的型別t必須有建構函式,createinstance和createinstance 都是有效的。但是createinstancelyunxsjnt;沒有建構函式。

4.轉換型別約束

一種約束允許你指定另乙個型別,型別實參必須可以通過一致性、引用或裝箱轉換隱式地轉換為該型別。你還可以規定乙個型別實參必須可以轉換為另乙個型別實參——這稱為型別引數約束。

理解的意思:可以互換,就是我們可以通過裝箱或者強制型別轉換成目標型別的 型別都可以用於型別引數傳入。

class sample where t:stream

有效:sample 這本身符合約束

無效:sample 因為string型別無法通過引用或者裝箱拆箱強制轉換成stream、

struct sample where t:idisposable

規定t必須為idisposable 型別的 引用型別

有效:sample引用轉換

無效:sample

分析:為什麼sqlconnection 可以而stringbuilder不可以?它們都是引用型別

1.sqlconnection實現了idisposable介面,所以可以協變

2.stringbuilder只實現了iserializable介面,無法通過途徑轉換為idisposable

class sample where t:icomparable

因為將icomparable整體當作約束,分析icomparable的型別,可以用type.isvaluetype判斷,true為值型別,false為引用型別

typeof(icomparable).isvaluetype   結果為false表示為引用型別

有效:sample(裝箱轉換)

無效:sample

也可以指定多種約束:

class sample where t:stream,ienumerable,icomparable

class sample where t:u

有效:samplelyunxsjnidisposable>

無效:sample

總結:要看傳入類引數是否可以轉換,檢視規定引數和傳入類引數是否實現同一介面,如果實現則可以,否則不可以。

不可以是以下:system.object,system.enum,system.valuetype,system.delegate,結構或密封類(string)

5.組合約束

對型別引數的約束有多個,注意:只能是一種型別,值型別和引用型別不能同時存在,沒用乙個型別即是引用型別,又是值型別。

由於每乙個值型別都有乙個無建構函式,此後不能再有建構函式約束

有效:class sample where t:class,idisposable,new()

class sample where t:stream where u:idispsable

無效:class sample where t:class,struct (沒有任何型別即時引用型別又是值型別的,所以為無效的)

class sample where t:stream,class (引用型別約束應該為第乙個約束,放在最前面,所以為無效的) stream只是約束傳入引數為stream具體型別,而class約束為引用型別,一開始我理解錯了

class sample where t:new(),stream   (new() 必須放在最後)

class sample where t:idisposable,stream (類必須放在介面前面,所以為無效的)

class sample where t:xmlreader,icomparwww.cppcns.comable,icomparable (對於轉換型別約束,同乙個介面不能出現多次)

class sample where t:struct where  u:class,t (型別形參「t」具有「struct」約束,因此「t」不能用作「u」的約束,所以為無效的)

class sample where t:stream ,u:idisposable  語法錯誤

看到網上還有這種版本也是有效的我表示不理解:

class sample where t:struct,idisapsable  idisapsab程式設計客棧le為值型別?

class sample where t:class where u:struct ,t   t為引用型別為何與值型別一起約束u?

希望可以指正

本文標題: c# 泛型的約束

本文位址:

c 泛型約束

在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定的。下表列出了六種型別的約束 約束說明 t struct 型別引數必須是值型別。可以指定除...

C 泛型約束

約束告知編譯器型別引數必須具備的功能。在沒有任何約束的情況下,型別引數可以是任何型別。編譯器只能假定 system.object 的成員,它是任何 net 型別的最終基類。有關詳細資訊,請參閱使用約束的原因。如果客戶端 嘗試使用約束所不允許的型別來例項化類,則會產生編譯時錯誤。通過使用where上下...

C 泛型約束

一 泛型約束 預設情況下,泛型的型別引數可以是任何型別的。為什麼要使用型別引數的約束呢?簡單點說就是篩選型別引數,在使用泛型的 中如果違反了某個約束不允許的型別來例項化則會產生編譯錯誤,型別引數的約束是使用關鍵字where。下面列出了6中型別的約束 泛型約束有以下幾種 where t base cl...