泛型约束概念
关键字 where
值类型 where T:struct
让泛型的类型有一定的限制
1值类型 where 泛型字母 struct
2引用类型 where 泛型字母 class
3存在无参公共构造函数 where 泛型字母 new()
4某个类本身或者其他派生类 where 泛型字母 类名
5某个接口的派生类型 where 泛型字母 接口名
6另一个泛型类本身或者派生类型 where 泛型字母 另一个泛型字母
各泛型约束讲解
值类型约束
cs
class Test1<T> where T:struct
{
public T value;
public void TestFun<K>(K v) where K:struct
{
}
}
Test1<int> t1 = new Test1<int>();
t1.TestFun<float>(1.3f);
引用类型约束
cs
class Test2<T> where T:class
{
public T value;
public void TestFun<K>(K k) where K:class
{
}
}
Test2<Random> t2 = new Test2<Random>();
t2.value = new Random();
t2.TestFun<object>(new object());
公共无参构造约束
cs
class Test3<T> where T:new()
{
public T value;
public void TestFun<K>(K k) where K : new()
{
}
}
class Test1
{
public Test1()
{
}
}
class Test2
{
public Test2(int a)
{
}
}
Test3<Test1> t3 = new Test3<Test1>();
类约束
cs
class Test4<T> where T : Test1
{
public T value;
public void TestFun<K>(K k) where K : Test1
{
}
}
class Test3:Test1
{
}
Test4<Test3> t4 = new Test4<Test3>();
接口约束
cs
interface IFly
{
}
interface IMove:IFly
{
}
class Test4:IFly
{
}
class Test5<T> where T : IFly
{
public T value;
public void TestFun<K>(K k) where K : IFly
{
}
}
Test5<IMove> t5 = new Test5<IMove>();
t5.value = new Test4();
另一个泛型约束
类型参数 T 必须继承自另一个类型参数 U
cs
class Test6<T,U> where T : U
{
public T value;
public void TestFun<K,V>(K k) where K : V
{
}
}
Test6<Test4, IFly> t6 = new Test6<Test4, IFly>();
约束的组合使用
cs
class Test7<T> where T: class,new()
{
}
多个泛型有约束
cs
class Test8<T,K> where T:class,new() where K:struct
{
}