一 Generic
如果使用Object会有哪些问题?
1.存在装箱、拆箱的性能问题
2.如果使用额外元素,会存在类型不安全的问题.
1 引入泛型:延迟声明
2 如何声明和使用泛型
3 泛型的好处和原理
4 泛型类、泛型方法、泛型接口、泛型委托
5 泛型约束
6 协变 逆变
7 泛型缓存
泛型 Generic 本质 ~占位符 (必须编译器支持)
1.泛型类、泛型方法、泛型接口、泛型委托
1.任何父类出现的地方都可以用子类替代;
2.泛型约束 :
1)基类约束 2)接口约束 3)引用类型约束 4)值类型约束 5)无参构造函数约束 关键字 where
值类型struct
、引用类型 Class
、父类、接口、new()
可实例化
3.协变&&逆变
协变 逆变 因为泛型存在的一个概念。只作用于
接口
委托
之中
协变
协变原理
所谓的协变 就是 泛型可以用父类返回类型。关键词 out
关键词 out T只能做返回值
声明由子类参数,改为父类参数
例如:IEnumerable\Func<int>
List<string> listA = new List<string>();
IEnumerable<object> listB = new List<string>();
listB = listA;
Func<string> func1 = () => "";
Func<object> func = func1;
逆变
逆变原理
所谓逆变 就是 泛型中 可以用父类做参数类型。关键词 in
关键词 in T只能做参数
声明子类泛型 --实例化父类
例如:Action<object>
//声明父类 并实例化
Action<object> actionobj = t => { };
//声明子类 并实例化
Action<string> actionstring = actionobj;
//actionobj = actionstring;//这种编译器是报错的
标签:Generic,子类,逆变,协变,泛型,父类
From: https://www.cnblogs.com/vsnb/p/15867675.html