4
 public interface IOInitializable<in ItemType>

什么是逆变:从较窄(圆形)转换为较宽(形状)

接口的意思?

后果和危害是什么?

我已阅读http://msdn.microsoft.com/en-us/library/dd469484.aspx但这对我没有帮助。

4

2 回答 2

3

我建议阅读 Tomas 的解释:

C# 4 中协变和逆变背后的理论

归结为一个事实,如果您有一个传递多个“圆”的方法调用,则可以使用一个接受多个“形状”的函数,只要它不返回“形状”(因为可能是也可能不是“圆圈”)。

于 2012-11-16T09:24:18.070 回答
3

IComparer 是一个很好的例子来证明这一点。IComparer 看起来像这样:

IComparer<in T>

采取以下措施:

IComparer<Primate>
IComparer<Chimpanzee>

在哪里Chimpanzee : Primate(当然)。需要 an 的方法IComparer<Chimpanzee>可以将 anIComparer<Primate>作为参数,因为如果比较器可以比较灵长类动物,它也可以比较黑猩猩,因为它使用两种类型的共同特征来影响比较

考虑这一点的一个好方法是在功能方面。协方差允许传递实现核心功能的更复杂的对象(例如为对象传递字符串)。逆变做了类似的事情......比较所有灵长类动物比只比较黑猩猩更复杂。它允许您将特定类型的比较器替换为比较更通用类型的比较器。从这个意义上说,“in”比传递的实际类型更适用于方法的功能。

于 2012-11-16T10:11:15.613 回答