位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C# > 問(wèn)題詳情

C# 約束類型

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-08

    前面用于泛型類的類型稱為無(wú)綁定(unbounded)類型,因?yàn)闆](méi)有對(duì)它們進(jìn)行任何約束。而通過(guò)約束(constraining)類型,可以限制用于實(shí)例化泛型類的類型,這有許多方式。例如,可以把類型限制為繼承自某個(gè)類型?;仡櫱懊媸褂玫腁nimal、Cow和Chicken類,可以把一個(gè)類型限制為Animal或繼承自Animal,則下面的代碼是正確的:

    MyGenericClass<Cow> = new MyGenericClass<Cow>();

但下面的代碼不能編譯:

    MyGenericClass<string> = new MyGenericClass<string>();

在類定義中,這可以使用where關(guān)鍵字來(lái)實(shí)現(xiàn):

    class MyGenericClass<T> where T : coAstraint { ... }

其中constraint定義了約束。可以用這種方式提供許多約束,各個(gè)約束之間用逗號(hào)分開(kāi):

    class MyGenericClass<T> where T : constraintl, constraint2 { ... }

還可以使用多個(gè)where語(yǔ)句,定義泛型類需要的任意類型或所有類型上的約束:

    class MyGenericClass<Tl, T2> where Tl : constraintl where T2 : constraints ( ...)

約束必須出現(xiàn)在繼承說(shuō)明符的后面:

    class MyGenericClass<Tl, T2> : MyBaseClass, IMylnterface where Tl : constraintl where T2 : constraint2 { ... }

下表列出了一些可用的約束。

約束

用法示例

struct

類型必須是值類型

在類中,需要值類型才能起作用,例如,T類型的成員變量是0,表示

某種含義

class

類型必須是引用類型

在類中,需要引用類型才能起作用,例如,T類型的成員變毋是null,

表示某種含義

base- class

類型必須是基類或繼承自基類??梢愿?據(jù)這個(gè)約束提供任意類名

在類中,貓要繼承自基類的某種基本功能,才能起作用

interface

類型必須是接口或?qū)崿F(xiàn)了接口

在類中,徭要接口公開(kāi)的某種基本功能,才能起作用

new()

類型必須有一個(gè)公共的無(wú)參構(gòu)造函數(shù)

在類中,需要能實(shí)例化T類型的變S,例如在構(gòu)造函數(shù)中實(shí)例化

可通過(guò)base-class約束,把一個(gè)類型參數(shù)用作另一個(gè)類型參數(shù)的約束,如下所示:

    class MyGenericClass<Tl, T2> where T2 : T1 { ... }

其中,T2必須與T1的類型相同,或者繼承自T1。這稱為裸類型約束(naked type constraint),表示一個(gè)泛型類型參數(shù)用作另一個(gè)類型參數(shù)的約束。

類型約束不能循環(huán),例如:

    class MyGenericClass<Tl, T2> where T2 : T1 where T1 : T2 { ... }

這段代碼不能編譯。


繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部