协变(out):和谐的变化 看起来符合逻辑的 如父类装子类 string变为object
逆变(in):不和谐的变化 看起来不舒服的 如子类装父类 object边string
协变、逆变用来装饰泛型、遵循里氏替换
1、用于泛型中修饰泛型字母
2、只能修饰泛型接口和泛型委托
3、out只能作为返回值
4、in只能作为参数
具体举例:
//out 只能作为返回值
delegate T TestOut<out T>();
//in 只能作为参数
delegate void TestIn<in T>(T t);
总结:
1、out装饰的泛型类型 只能作为返回值 in装饰的泛型类型 只能作为参数
2、遵循里氏替换原则 用out、in装饰的泛型委托 可以相互装载(父类、子类可互相转换)