C# 泛型约束
泛型约束
定义泛型时,可以对泛型类或泛型接口,方法能够接收的类型参数的种类加以限制。在编译阶段,如果使用不符合要求的类作为类型参数,则会产生编译错误。
泛型约束的声明格式
使用where关键字指定泛型约束
泛型约束使用where关键字指定。例如,要限制一个泛型类必须具有无参数公共构造函数,代码如下:
class Stack<TElement> where TElement :new()
几种约束的格式说明
where T:struct
class Stack<TElement> where TElement :struct
限制类型参数必须是(任何)值类型,并且不可以是可空值类型(例如int?,char?,double?,bool?等)
where T: class
class Stack<TElement> where TElement :class
限制类型参数必须是(任何)引用类型
where T:基类名
class Stack<TElement> where TElement :BaseClass
限制类型参数必须是继承自指定的基类,或是基类本身
where T:接口名
class Stack<TElement> where TElement :IInterface
限制类型参数必须是实现指定接口,或是指定接口
where T:new()
class Stack<TElement> where TElement :new()
限制类型参数必须具有无参构造函数
泛型约束的意义
泛型约束可以保证传递的类型参数符合一定的条件,并且在编译阶段就可以进行验证:例如添加T: new()约束可以保证传递的类型参数一定包含无参构造函数,添加基类约束可以保证类型一定派生自某个基类。
有了上面的保证,我们就可以在泛型类中调用T类型的构造函数,或者调用其基类的方法。
约束的叠加规则
|
例如:
多个参数
对于一种表示“键值对”关系的泛型类KeyValue<TKey,TValue>,该类具有两个泛型参数TKey,TValue,要为其都添加约束,如
public class KeyValue<TKey,TValue> where TKey : new() where TValue: class,new()