理解 C# 泛型接口中的协变与逆变(抗变)

一、协变和逆变是什么?

先从字面上理解 协变(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、在向函数输入时,参数 sstring 类型转换为 object 类型
22、在函数输出(返回)时,返回值 由 string 类型转换为 object 类型
我们这里可以看作是函数签名可发生变换(不论函数的内容,不影响结果):<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值