泛型
大约 2 分钟
泛型
- 泛型是类型的模板,类型是实例的模板;
- C# 提供了5种泛型:类、结构、接口、委托、方法;
- 使用类型占位符代替类型;
- 调用:如果从形参表中能够推断出类型参数的实参,则可以省略尖括号和类型参数
泛型类
public MyClass<T1,T2,T3>
where T2:Customer // 使用 where 约束 T2/T3 的类型
where T3:IComparable // 约束末尾没有分隔符
{
...
}
// where TypeParam : constraint, onstraint, …
// 多个 where 之间没有分割
// 多个 where 之间没有次序之分
// where 子句最多只能有一个主约束,放在第一位
// where 子句如果存在构造函数约束 new( ),必须放在最后
// where 子句可以有多个接口约束
约束的类型
约束类型 | 描述 |
---|---|
类名 | 指定类及从它继承的类 |
class | 任何引用类型 |
struct | 任何值类型 |
接口名 | 指定的接口及实现此接口实现类 |
new() | 任何带有无参公共 |
泛型结构、泛型委托、泛型接口
- 参考结构、委托、接口和泛型类。
可变性:协变、逆变
变化一般发生于委托、接口赋值变量的时候;
赋值兼容性:将派生类对象实例赋值给基类变量;
协变:结构化的委托中派生类只是用于输出值叫协变;
逆变:在期望传入基类时允许传入派生对象的特性叫逆变;
变化只适用于引用类型;
显示变化使用in和out关键字只适用于委托和接口,不适用于类、结构、方法;
不包括in和out关键字的委托和接口类型参数叫做不变;
// out关键字指定了类型参数的协变 // 协变关系允许程度更大的派生类型作为返回值及输出参数 delegate T Fun<out T>( ); // in关键字指定了逆变关系 // 逆变允许更高程度的派生类型作为输入参数 void Fun<in T>( );