栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

协方差和反方差之间的差异

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

协方差和反方差之间的差异

问题是“协方差和逆方差有什么区别?”

协方差和逆方差 是将集合的一个成员与另一个成员关联的映射函数的 属性。更具体地说,相对于该集合上的 关系 ,映射可以是协变的或相反的。

考虑所有C#类型集的以下两个子集。第一:

{ Animal,   Tiger,   Fruit,   Banana }.

其次,这个明显相关的集合:

{ IEnumerable<Animal>,   IEnumerable<Tiger>,   IEnumerable<Fruit>,   IEnumerable<Banana> }

从第一组到第二组有一个 映射 操作。即,对于第一集合中的每个T,第二集合中的 对应
类型为

IEnumerable<T>
。或者,简而言之,映射为
T → IE<T>
。请注意,这是一个“细箭头”。

到目前为止和我在一起?

现在让我们考虑一个 关系 。第一组类型对之间存在 分配兼容性关系

Tiger
可以将type的值分配给type的变量
Animal
,因此这些类型被称为“分配兼容”。让我们以较短的形式编写“
X
可以将类型的值分配给类型的变量
Y
”:
X ⇒ Y
。请注意,这是一个“胖箭头”。

因此,在我们的第一个子集中,这是所有分配兼容性关系:

Tiger  ⇒ TigerTiger  ⇒ AnimalAnimal ⇒ AnimalBanana ⇒ BananaBanana ⇒ FruitFruit  ⇒ Fruit

在支持某些接口的协变量分配兼容性的C#4中,第二组类型对之间存在分配兼容性关系:

IE<Tiger>  ⇒ IE<Tiger>IE<Tiger>  ⇒ IE<Animal>IE<Animal> ⇒ IE<Animal>IE<Banana> ⇒ IE<Banana>IE<Banana> ⇒ IE<Fruit>IE<Fruit>  ⇒ IE<Fruit>

注意,映射

T → IE<T>
保留分配兼容性的存在和方向 。也就是说,如果
X ⇒ Y
,则也是如此
IE<X> ⇒ IE<Y>

如果在粗箭头的两侧都有两个东西,则可以用相应的细箭头右侧的东西替换两侧。

相对于特定关系具有此属性的映射称为“协变量映射”。这应该是有道理的:在需要一系列动物的情况下,可以使用一系列老虎,但事实并非如此。需要老虎序列时,不一定必须使用动物序列。

那是协方差。现在考虑所有类型集合的这个子集:

{ IComparable<Tiger>,   IComparable<Animal>,   IComparable<Fruit>,   IComparable<Banana> }

现在我们有了从第一组到第三组的映射

T → IC<T>

在C#4中:

IC<Tiger>  ⇒ IC<Tiger>IC<Animal> ⇒ IC<Tiger>     Backwards!IC<Animal> ⇒ IC<Animal>IC<Banana> ⇒ IC<Banana>IC<Fruit>  ⇒ IC<Banana>     Backwards!IC<Fruit>  ⇒ IC<Fruit>

也就是说,映射

T → IC<T>
已经 保留了存在,但反转的方向 分配的兼容性。也就是说,如果
X ⇒ Y
,则
IC<X> ⇐ IC<Y>

其中A映射 蜜饯但反转 的关系被称为 逆变 映射。

同样,这显然是正确的。可以比较两个动物的设备也可以比较两个老虎,但是可以比较两个老虎的设备不一定可以比较任何两个动物。

因此,这就是C#4中协方差和相反方差的区别。协方差 保留 了可分配性的方向。逆差 反转



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447174.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号