泛型的类型
泛型类与接口:
class 类名 <泛型占位字母>
interface 接口名 <泛型占位字母>
泛型函数:
函数名<泛型占位字母>(参数列表)
泛型占位字母可多个用 , 隔开
//普通类的泛型方法
class Test
{
public void TestFun<T>(T value)
{
T t =default(T);//不确定泛型类型用default返回默认值
Console.WriteLine(value);
}
public T TestFun<T>(int i)
{
return default(T);
}
public void TestFun<T, U>(T t,U u)
{
Console.WriteLine(t);
Console.WriteLine(u);
}
}
//泛型类中的泛型方法
class Test<T>
{
public T t;
//这才是泛型方法
public void TestFun<K>(K k)
{
}
// 这不是泛型方法,因为在类声明的时候T被指定了,使用时不能动态变化
public void TestFun(T t)
{
}
}
泛型的约束
约束种类:
1.值类型 where 泛型字母:struct
2.引用类型 where 泛型字母:class
3.存在无参公共构造函数(抽象类不行) where 泛型字母:new()
4.某个类本身或者派生类 where 泛型字母:类名
5.某个接口的派生类型 where 泛型字母:接口名
6.另一个泛型类型本身或者派生类型 where 泛型字母:另一个泛型字母
class Test1:
{
}
class Test2:Test1
{
}
class Test3
{
}
//T被U约束,T只能是U的本身或派生
class Test<T,U> where T : U
{
}
internal class Program
{
static void Main(string[] args)
{
//可行,Test2继承Test1,是Test1的派生
Test<Test2,Test1> test = new Test<Test2,Test1>();
//不可行,Test3未继承Test1
Test<Test3,Test1> test2;=new Test<Test3,Test1>();
}
1.引入约束后会预先给这个泛型一些功能比如引入where T: IEnumerable后就可以在代码块中使用foreach来遍历。
2.约束可组合使用,new()要放最后。例:class Test<T> where T:class ,new()
3.多个泛型约束 例:class Test<T,K> where T:class,new() where K:struct