c#4.0协变逆变的理解

协变 对应返回类型。
逆变 对应参数类型。

第一点:不管是协变还是逆变,其实都是完全遵从类型兼容的,只是将一个本来应该默认实现的东西,改为显式的声明。这个是从调用者角度出发的观点,你可以把协变和逆变都认为是“理所当然”的。

第二点,在理解的时候,需要把参考的对象固定为函数相对函数的兼容上。

 

把父类看作更大的类型。

 从小到大 是协调的。

从大到小 是反常的。

 举例:

 大 funA(小)。

 小 funB(大)。

 funA 包容 funB。因为所有用到funA的场合都能替换成funB,反之不成立。

 

从函数兼容的角度(funB -> funA):

返回类型是协调的。

参数类型是反常的。

 

从调用者角度,从来都是由小类型传到大类型的。

四种调用场合:

大 a = funB()

funB(小)

大 a = funA()

funA(小)

 

只属于funB的特定场合:

小 a = funB()

funB(大)

 

你可能感兴趣的:(c#4.0协变逆变的理解)