首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型差异

类型差异
EN

Stack Overflow用户
提问于 2013-04-26 00:22:59
回答 1查看 233关注 0票数 1

以下总结了我对C#中差异的理解。如果你能告诉我问题出在哪里,我会很感激,因为我读过埃里克·利珀特( Eric )在方差有效性的精确规则上发表的那篇文章,我无法理解其中的大部分内容。

方差是指一种类型的转换(或者像Eric Lippert所说的那样的投影)可以保持赋值兼容性(协方差),或者逆转它(反方差),或者既不能保持它,也不能逆转它(不变性)。也就是说,如果我是T中的协变量转换,其中T是一组类型,那么对于T中的任何T1和T2类型,如果T1可分配给T2,则I<T1>可分配给I<T2>。如果我是反差的话,结果就会恢复。如果我是不变的,那么I<T1>既不能分配给I<T2>,也不能分配给I<T2>

对于一个类型来说,协变还是反变意味着什么?方差不是类型投影的属性,也不是类型本身的属性。

泛型I<out T, in U>在T上是协变的,在U上是反差的,这是什么意思?

反差效度逆转变异效度的方向,协变效度逆转变异效度的方向意味着什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-26 04:31:25

对于一个类型来说,协变还是反变意味着什么?方差不是类型投射的属性,而不是类型本身的属性吗?

是的,你很在行。好吧,你几乎被盯上了。方差是类型相对于类型上给定关系的投影的一个属性。

请考虑以下发言:

  • 从引用类型T映射到IEnumerable<T>类型的投影保留了赋值兼容性关系的方向,因此该投影是协变的。
  • TIEnumerable<T>的投影在T中是协变的。
  • IEnumerable<T>T中是协变的。
  • IEnumerable<T>是协变的。

我们说第四个,我们指的是第一个。我们假设,通过"IEnumerable<T>是协变的“,从上下文中可以清楚地看出投影是什么(从TIEnumerable<T>),以及保留的关系是什么(赋值兼容性)。这样说就更容易了。

在您提到的文章中,我在一开始甚至比这更糟糕;我使用“协变”基本上是指“可以在某种程度上涉及到协变转换”。然而,“协变有效”等定义是精确的。如果称它为“共同有效”使其难以理解,那么就称它为其他东西:

如果X类型是指针或非泛型的,或者是具有Frobby元素类型的数组,则称为Frobby类型,或者泛型类型,其中每个"in“类型参数都是both,每个"out”类型参数都是Frobby,其他所有类型的参数都是Frobby和both。如果它是指针或非泛型的,或者是一个具有both元素类型的数组,或者是一个泛型类型,其中每个"in“类型参数都是Frobby,每个"out”类型参数都是B龙虾,而其他所有类型的参数都是Frobby和both,则称为both。

在那里,我们根本没有使用“协变”或“反变”这两个词,而且我们对Frobby和Blobby都有一个精确的定义。

泛型I<out T, in U>T上是协变的,在U上是反变体是什么意思?

再说一遍,这只是一个简短的形式。第一部分是指对于任何固定的U,从引用类型TI<T, U>的投影是一个保持赋值兼容性方向的投影。如果X是与Y兼容的赋值,而Z是任何类型的,那么I<X, Z>是与I<Y, Z>兼容的赋值。

同样地,对于逆变部分,除了现在T是固定的,并且投影反转关系的方向。

此外,“反差效度逆转变异效度的方向”意味着什么?

我的意思是,如果你阅读协变有效性的规则,并将它们与反变有效性的规则进行比较,你会发现这些规则基本上是相同的,只是一些规则“倒退”了。这就是为什么我们称之为*相反*方差。

我的博客上有十几篇关于方差的文章,如果你对这个话题感兴趣的话,你可能会想从一开始就读它们。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16226831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档