泛型雖然在例項化時可以指定為任意型別,但是實際業務中,並不是都需要這樣,更多的時候因為業務邏輯而需要新增一些約束。泛型新增約束使用where子句,如listwhere t:class表示t只能是引用型別。下文將展示泛型約束的基本用法與基本概念。
一、約束型別
約束型別有六種,分別是class,struct,基類,介面,new(),unmanaged,其中unmanaged在c#7.3以後版本才支援,new()與其他約束一起使用時必需放在最後。
不允許作為基類約束的型別有:object、array 和 valuetype。 在 c# 7.3 之前,enum、delegate 和 multicastdelegate 也不允許作為基類約束。
二、用法示例
下文將展示如何使用介面型別作為約束。
1、建立ianimal介面,**如下:
public inte***ce ianimal
decimal weight
string selfintroduction();
}2、建立animal類,實現ianimal介面,**如下:
public class animal : ianimal
public string name
public decimal weight
public string selfintroduction()
:i am ,my weight is kg.";}}
3、建立靜態泛型型別約束方法,**如下:
static void show(ienumerableanimals)
where tanimal : ianimal
}4、例項化animal類,呼叫泛型方法,**如下:
static void main(string args)
;show(animals);
console.readkey();
}執行結果如圖:
泛型型別約束
where 泛型型別約束 c 參考 visual studio 2015 其他版本 在泛型型別定義中,where 子句用於指定對下列型別的約束 這些型別可用作泛型宣告中定義的型別引數的實參。例如,可以宣告乙個泛型類 mygenericclass,這樣,型別引數 t 就可以實現 icomparable...
c 泛型約束
在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定的。下表列出了六種型別的約束 約束說明 t struct 型別引數必須是值型別。可以指定除...
C 泛型約束
約束告知編譯器型別引數必須具備的功能。在沒有任何約束的情況下,型別引數可以是任何型別。編譯器只能假定 system.object 的成員,它是任何 net 型別的最終基類。有關詳細資訊,請參閱使用約束的原因。如果客戶端 嘗試使用約束所不允許的型別來例項化類,則會產生編譯時錯誤。通過使用where上下...