泛型的约束
- 默认情况下,泛型的类型参数(parameter)可以是任何类型的。
- 如果只允许使用特定的类型参数(argument),就可以指定约束。
泛型约束 例子
泛型约束
T是不可空的值类型 这个泛型代表了可空值类型
T有一个无参的构造函数 可以new
裸类型约束
泛型类型的子类
- 泛型class可以有子类,在子类里,可以继续让父类的类型参数保持开放
class Stack {...}
class SpecialStack {...}
- 在子类里,也可以使用具体的类型来关闭(封闭)父类的类型参数
class InStack: Stack{...}
- 子类型也可以引入新的类型参数
class List
class KeyedList:List{..}
泛型类型的子类
- 技术上来讲,所有子类的类型参数都是新鲜的。你可以认为子类先把父类的类型参数(argument)给关闭了,然后又打开了。为这个先关闭后打开的类型参数(argument)带来新的名称或含义。
class List{...}
class KeyedList:List{..}
自引用的泛型声明
- 在封闭类型参数(argument)的时候,该类型可以把它自己作为具体的类型。
静态数据
- 针对每一个封闭类型,静态数据是唯一的
类型参数和转换
- C#的转换操作符支持下列转换:
- 数值转换
- 引用转换
- 装箱拆箱转换
- 自定义转换
- 决定采用的是哪种转换,发生在编译时,根据已知类型的操作数来决定。