1.泛型:延迟声明:不指定参数类型,调用是才指定,把参数类型的声明推迟到调用
2.泛型包含:泛型类、泛型方法、泛型接口、泛型委托、逆变/协变、泛型缓存
3.泛型约束
1.接口约束 Where T : 接口
2.基类约束 Where T : 基类
3.引用类型约束 Where T : class
4.值类型约束 Where T : struct 默认default(T) 会根据T的不同赋予默认值
5.无参数构造函数约束 Where T : new()
6.约束类型不能是密封类sealed
7.约束可以叠加 where T : A,B,new()....
4.协变和逆变 例如两个类
public class Bird{}
public class Sparrow:Bird{}
1.协变: 当你 Bird b = new Sparrow()没问题,但 List<Bird> b = new List<Sparrow>()时就会报错,
此时你只能用 List<Bird> l = new List<Sparrow>().Select(c =>(Brid)c).ToList()把每一个对象转换为Bird才可以,因为两个List集合没有父子关系
此时可以使用协变,协变只能用于接口和委托,
IEnumerable<Bird> list = new IEnumerable<Sparrow>()
Fun<Bird> f = new Fun<Sparrow>(()=>null)
2.协变在声明接口时加参数out,只能是返回结果,不能当作参数
3.逆变 声明接口时参数加 in,不能当作返回值,只能当作参数使用,左边是子类,右边可以是父类也可以是子类,和协变相反
4.协变和逆变同时使用
如:声明时,同事赋予in out
5.泛型缓存:
1.每个不同的T都会生成一个不同的副本;
2.适合不同的类型,需要缓存一份数据的场景;效率高;
3.但相同类型的数据只会缓存一次;
4.缓存不能释放