Covariance (协变), Contravariance (逆变) and Invariance (不变)

关于类型和子类型之间的关系,关于类型转换,决定方法是被重写还是重载。

只用于泛型接口泛型委托
在泛型中,是需要严格类型匹配的,才能保证类型安全。在某些场景中为了兼顾灵活性、复用性,便有了协变、逆变。

输出 out 协变,可用派生程度更大的子类替换父类型的参数,只能用于方法的返回值。子类隐式转换为父类,就是标准的里氏替换原则。
IEnumberable

IEnumberable obj = new List();

输入 in 逆变,可用派生程度更小的父类替换子类型参数, 只能用于方法的输入参数。
IComparer

IComparer comparer1 = Comparer.Default;

当是out参数的时候,那么它就要求实际的返回对象至少是父类,或者基于T的子类。
当是in参数的时候:那么他可以T对象实参,也能传T的父类对象实参进去。

Invariance (不变)
类型参数必须严格匹配。
适用于 既有输入又有输出的类型。

posted @ 2019-12-31 18:43  wesson2019  阅读(222)  评论(0)    收藏  举报