1、泛型约束
让泛型的类型有一定的限制
关键字:where
泛型约束一共有6种:
值类型 where 泛型字母:struct 引用类型 where 泛型字母:class 存在无参公共构造函数 where 泛型字母:new() 某个类本身或者派生类 where 泛型字母:类名 某个接口的派生类型(派生类型可以为类或接口) where 泛型字母:接口名 另一个泛型类型本身或者派生类型 where 泛型字母:另一个泛型字母
2、各泛型约束讲解
列举部分,未列举的类似
(1)值类型约束
class Test<T> where T:struct{ public T value; public void TestFun<K>(K v) where K:struct{ } }
(2)引用类型约束
class Test<T> where T:class{ public T value; public void TestFun<K>(K v) where K:class{ } }
(3)公共无参构造约束
class Test<T> where T:new(){ public T value; public void TestFun<K>(K v) where K:new(){ } } public Test2{ // 如果该类的公共无参构造被重载覆盖,或者无参构造被声明为private,会报错 // 该类也不能为抽象类 }
Test<Test2> t = new Test<Test2>(); Test<int> t = new Test<int>(); // 结构体的无参构造不会被覆盖,所有的结构体都有无参构造函数
(4)另一个泛型约束
class Test<T,U> where T:U{ public T value; public void TestFun<K,V>(K k) where K :V{ } }
其中T与U相同或者T是U的派生类型,K类似
3、约束的组合使用
class Test<T> where T:class, new(){ }
但是要注意
class Test<T> where T : new(),class{ }
会报错,因此new()一般写在最后
4、多个泛型有约束
后面空格接where,同样的格式
class Test<T,K> where T:class, new() where K:struct{ }
5、练习
用泛型实现一个单例模式基类
// where T : new() 是因为 instance = new T() 要确保 T 类型要有无参构造函数,但这样会导致类的构造函数是 public 的 class SingleBase<T> where T : new(){ private static T instance = new T(); public static T Instance { get { return instance; } } } class Test : SingleBase<Test> { public int value = 10; }