c#4.0协变逆变的理解
协变 对应返回类型。
逆变 对应参数类型。
第一点:不管是协变还是逆变,其实都是完全遵从类型兼容的,只是将一个本来应该默认实现的东西,改为显式的声明。这个是从调用者角度出发的观点,你可以把协变和逆变都认为是“理所当然”的。
第二点,在理解的时候,需要把参考的对象固定为函数相对函数的兼容上。
把父类看作更大的类型。
从小到大 是协调的。
从大到小 是反常的。
举例:
大 funA(小)。
小 funB(大)。
funA 包容 funB。因为所有用到funA的场合都能替换成funB,反之不成立。
从函数兼容的角度(funB -> funA):
返回类型是协调的。
参数类型是反常的。
从调用者角度,从来都是由小类型传到大类型的。
四种调用场合:
大 a = funB()
funB(小)
大 a = funA()
funA(小)
只属于funB的特定场合:
小 a = funB()
funB(大)