以下总结了我对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上是反差的,这是什么意思?
反差效度逆转变异效度的方向,协变效度逆转变异效度的方向意味着什么?
发布于 2013-04-26 04:31:25
对于一个类型来说,协变还是反变意味着什么?方差不是类型投射的属性,而不是类型本身的属性吗?
是的,你很在行。好吧,你几乎被盯上了。方差是类型相对于类型上给定关系的投影的一个属性。
请考虑以下发言:
T映射到IEnumerable<T>类型的投影保留了赋值兼容性关系的方向,因此该投影是协变的。T到IEnumerable<T>的投影在T中是协变的。IEnumerable<T>在T中是协变的。IEnumerable<T>是协变的。我们说第四个,我们指的是第一个。我们假设,通过"IEnumerable<T>是协变的“,从上下文中可以清楚地看出投影是什么(从T到IEnumerable<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,从引用类型T到I<T, U>的投影是一个保持赋值兼容性方向的投影。如果X是与Y兼容的赋值,而Z是任何类型的,那么I<X, Z>是与I<Y, Z>兼容的赋值。
同样地,对于逆变部分,除了现在T是固定的,并且投影反转关系的方向。
此外,“反差效度逆转变异效度的方向”意味着什么?
我的意思是,如果你阅读协变有效性的规则,并将它们与反变有效性的规则进行比较,你会发现这些规则基本上是相同的,只是一些规则“倒退”了。这就是为什么我们称之为*相反*方差。
我的博客上有十几篇关于方差的文章,如果你对这个话题感兴趣的话,你可能会想从一开始就读它们。
https://stackoverflow.com/questions/16226831
复制相似问题