C# - Generic
定义泛型类
创建泛型类,在类定义中包含尖括号语法
class MyGenericClass<T>
{
...
}
T可以是任意标识符,只要遵循通常的C#命名规则即可。泛型类可以在其定义中包含多个类型,用逗号分隔开
class MyGenericClass<T1, T2, T3>
{
...
}
定义了这些类型后,就可以在类定义中像使用其他类型那样使用它们。
如果把构造函数改为 innerT1Object = new T1();编译会出错,因为当前不知道T1是什么,也不能使用它的构造函数,甚至可能没有构造函数。
default关键字
如果像这样赋值innerT1Object = null;编译会出错,因为此时不知道此类型是值类型还是引用类型那么可以用default关键字解决这个问题。
innerT1Object = default(T1) 如果innerT1Object是引用类型,就给它赋予null值,如果它是值类型,就给它赋予相应的默认值。
约束类型
前面用于泛型类的类型称为无绑定类型,因为没有对它们进行任何约束。而通过约束类型,可以限制可用于实例化泛型类的类型。可以把类型限制为继承自某个类型。
在类定义中,可以使用where关键字来实现。
class MyGenericClass<T1, T2>: MyBaseClass, IMyInterface
where T1 : constraint1 where T2 : constraint2
{
...
}
如果new() (类型必须有一个公共的无参构造函数)用作约束,它就必须是为类型指定的最后一个约束。
可以通过base-class约束,把一个类型参数用作另一个类型参数约束。
class MyGenericClass<T1, T2> where T2 : T1
{
...
}
T2必须与类型T1的类型相同,或者继承自T1。这称之为裸类型约束。类型约束不能循环。