天天看点

类型参数的约束(C# 编程指南) 类型参数的约束(C# 编程指南)

visual studio 2005

<a target="_blank">其他版本</a>

类型参数的约束(C# 编程指南) 类型参数的约束(C# 编程指南)

在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。下表列出了六种类型的约束:

约束

说明

t:结构

t:类

类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

t:new()

类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。

t:&lt;基类名&gt;

类型参数必须是指定的基类或派生自指定的基类。

t:&lt;接口名称&gt;

类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

t:u

为 t 提供的类型参数必须是为 u 提供的参数或派生自为 u 提供的参数。这称为裸类型约束。

<a target="_blank">使用约束的原因</a>

<a target="_blank"></a>

<a target="_blank">c#</a>

约束使得泛型类能够使用 employee.name 属性,因为类型为 t 的所有项都保证是 employee 对象或从 employee 继承的对象。

可以对同一类型参数应用多个约束,并且约束自身可以是泛型类型,如下所示:

通过约束类型参数,可以增加约束类型及其继承层次结构中的所有类型所支持的允许操作和方法调用的数量。因此,在设计泛型类或方法时,如果要对泛型成员执行除简单赋值之外的任何操作或调用 system.object 不支持的任何方法,您将需要对该类型参数应用约束。

false。

这种情况的原因在于,编译器在编译时仅知道 t 是引用类型,因此必须使用对所有引用类型都有效的默认运算符。如果需要测试值相等性,建议的方法是同时应用 where t : icomparable&lt;t&gt; 约束,并在将用于构造泛型类的任何类中实现该接口。

<a target="_blank">未绑定的类型参数</a>

没有约束的类型参数(如公共类 sampleclass&lt;t&gt;{} 中的 t)称为未绑定的类型参数。未绑定的类型参数具有以下规则:

不能使用 != 和 == 运算符,因为无法保证具体类型参数能支持这些运算符。

可以在它们与 system.object 之间来回转换,或将它们显式转换为任何接口类型。

<a target="_blank">裸类型约束</a>

用作约束的泛型类型参数称为裸类型约束。当具有自己的类型参数的成员函数需要将该参数约束为包含类型的类型参数时,裸类型约束很有用,如下面的示例所示:

在上面的示例中,t 在 add 方法的上下文中是一个裸类型约束,而在 list 类的上下文中是一个未绑定的类型参数。

裸类型约束还可以在泛型类定义中使用。注意,还必须已经和其他任何类型参数一起在尖括号中声明了裸类型约束:

泛型类的裸类型约束的作用非常有限,因为编译器除了假设某个裸类型约束派生自 system.object 以外,不会做其他任何假设。在希望强制两个类型参数之间的继承关系的情况下,可对泛型类使用裸类型约束。