目录
1.什么是协变逆变?
协变:和谐的变化,自然的变化。
因为里氏替换原则父类可以装子类,所以子类变父类,比如string变成object是和谐的。
逆变:逆常规的变化,不正常的变化。
逆常规的变化,不正常的变化。因为里氏替换原则父类可以装子类,但是子类不能装父类。所以父类变子类,比如object变string是不和谐的。
协变和逆变是用来修饰泛型的。
协变:out
逆变:in
用于在泛型中修饰泛型字母的,只有泛型接口和泛型委托能使用。
2.结合里氏替换原则理解(作用)
⚡常用于各类考核面试中,在实际开发当中使用比较少,如果以下你不是很明白也没有很大的关系。
1 返回值和参数
用out修饰的泛型只能作为返回值。
delegate T TestOut<out T>();
用in修饰的泛型只能作为参数
delegate void TestIn<in T>(T t);
2 结合里氏替换原则理解
指装载时的协变逆变。但是原来还是父类装子类。加out和in不会报错。
需要注意的是,这里与泛型息息相关,是符合里氏替换原则的,而所谓协变逆变只是体现在相互装载的情况下,在具有父子关系的两个泛型可以通过out和in相互装载,看上去像父类装载了子类,子类装载了父类。
3.总结
逆变:in
协变: out
用来修饰泛型替代符的,只能修饰接口和委托中的泛型。
作用:
1 out修饰的泛型类型只能作为返回值类型,in修饰的泛型类型只能作为参数类型。
2 遵循里氏替换原则的,用in和out修饰的泛型委托,可以相互装载(有父子关系的泛型)。