21
10

C#泛型接口的协变和逆变

0
归档:2022年10月分类:C#和.NET
内容纲要

一、协变和逆变是什么?

先从字面上理解 协变(Covariance)、逆变(Contravariance)。

co- 是英文中表示“协同”、“合作”的前缀。协变 的字面意思就是 “与变化的方向相同”。
contra- 是英文中表示“相反”的前缀,逆变 的字面意思就是是 “与变化方向相反”。

官方:协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。

那么问题来了,这里的“变化方向”指的是什么?

C# 中对于对象(即对象引用),仅存在一种隐式类型转换,即 子类型的对象引用到父类型的对象引用的转换。这里的变化指的就是这种 子->父 的类型转换。

协变与逆变虽然从名字上看是两个完全相反的转换,但其实只是“子类型引用到父类型引用”这一过程在函数中使用的“两个不同阶段”而已,接下来将详细说明这点。

二、为什么需要协变和逆变

三、协变例子

四、逆变例子

五、.NET自带的协变和逆变委托和泛型


声明: 本文采用 BY-NC-SA 协议进行授权. 未标注“转”的文章均为原创,转载请注明转自: C#泛型接口的协变和逆变

公告栏

欢迎大家来到我的博客,我是dodoro,希望我的博客能给你带来帮助。