【问题标题】:Is it a mistake in msdn documentation for covariance at delegates?代表协方差的 msdn 文档中是否有错误?
【发布时间】:2016-10-24 20:14:15
【问题描述】:

在关于协变和逆变的this msdn documentation 中解释了out 关键字用于声明泛型参数协变。

您可以使用 out 关键字声明泛型类型参数协变。

然后给出out关键字的用法示例,然后,在此声明中,将委托称为“逆变”的方法参数,我认为应该称为“协变” " 因为它仍然标有out

这条规则有一个例外。如果您将 逆变 泛型委托作为方法参数,则可以将该类型用作委托的泛型类型参数。

那么这个例子如下:

interface ICovariant<out R>
{
    void DoSomething(Action<R> callback);
}

不应该是称为协变的委托参数而是逆变的吗?

【问题讨论】:

  • Action&lt;T&gt; 逆变的;不是协变的。

标签: c# delegates covariance msdn contravariance


【解决方案1】:

从 Servy 的评论中,我明白了这句话的意思,不是逆变接口,而是Action&lt;T&gt;,它是一个通用逆变委托。所以msdn的文档是对的,只是我以为这句话是关于接口的泛型类型参数被认为是逆变的,是我的一个误解。是这样的:

interface ICovariant<out R> //this is covariant
{
    void DoSomething(Action<R> callback); //this is contravariant
}

【讨论】:

  • 方差适用于泛型类型参数,所以它是R,它在ICovariant 中是协变的。逆变反转子/超类型关系,Action 委托的参数类型是逆变的。在逆变位置使用逆变参数是协变的,因为顺序被颠倒然后再次颠倒。
  • 所以@Lee,接口的参数R是协变的,从out关键字可以看出。但它在传递给 Action 时被转换为逆变。在这之后你为什么说它被转换回协变?因为我看到的是在逆变位置使用协变参数...
  • 参数类型TAction&lt;T&gt;是逆变的,而callback在逆变位置,所以你在逆变位置有一个逆变参数,它是协变的。
  • @Lee Action 确实是从msdn public delegate void Action( T obj ) 逆变的,我可以看到in 关键字,但你为什么说回调是在导致协变的逆变位置?在这种情况下,所有 Action 的使用都会导致协变行为,不是吗?请随时回答问题,我会很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多