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; }
C# 泛型约束详解
本文详细介绍了C#中泛型约束的概念及其六种主要形式,并通过具体示例展示了如何应用这些约束来限定泛型参数的类型。此外,还讨论了泛型约束的组合使用及多个泛型参数的约束设定。
439

被折叠的 条评论
为什么被折叠?



