一、协变和逆变是什么?
先从字面上理解 协变(Covariance)、逆变(Contravariance)。
co- 是英文中表示“协同”、“合作”的前缀,协变 的字面意思就是 “与变化的方向相同”。
contra- 是英文中表示“相反”的前缀,逆变的字面意思就是是 “与变化方向相反”。
那么问题来了,这里的 变化方向 指的是什么?
C# 中对于对象(即对象引用),仅存在一种隐式类型转换,即 子类型的对象引用到父类型的对象引用的转换。这里的变化指的就是这种 子->父 的类型转换。
//string (子类)类型的引用转换为 object (父类)类型的引用
object o = "hello";
协变 与逆变虽然从名字上看是两个完全相反的转换,但其实只是“子类型引用到父类型引用”这一过程在函数中使用的两个不同阶段而已,接下来将详细说明这点。
二、使用函数的不同阶段发生的类型转换
假设有一函数,接收 object 类型的参数,输出 string 类型的返回值:
string Method(object o)
{
return "abc";
}
那么在Main函数中我们可以这样调用它:
string s = "abc";
object o = Method(s);
注意,这里发生了两次隐式类型转换:
1、在向函数输入时,参数 s 由 string 类型转换为 object 类型
22、在函数输出(返回)时,返回值 由 string 类型转换为 object 类型
我们这里可以看作是函数签名可发生变换(不论函数的内容,不影响结果):<