msdn 文档中代表的协方差是否有错误?
Is it a mistake in msdn documentation for covariance at delegates?
在this msdn documentation关于协变和逆变中解释说out
关键字用于声明泛型参数协变。
You can declare a generic type parameter covariant by using the out keyword.
然后给出了out
关键字的用法的例子,然后就是这个语句里面说delegate作为方法参数是"contravariant",我think 应该叫 "covariant" 因为它仍然标有 out
:
There is one exception to this rule. If you have a contravariant generic delegate as a method parameter, you can use the type as a generic type parameter for the delegate.
那么这个例子如下:
interface ICovariant<out R>
{
void DoSomething(Action<R> callback);
}
委托参数不应该叫协变而是逆变吗?
从 Servy 的评论中我理解了这句话的意思,它不是逆变的接口,而是 Action<T>
是一个通用的逆变委托。所以msdn的文档是对的,当时我以为那句话是关于接口的泛型类型参数被认为是逆变的,这只是我的一个误会。是这样的:
interface ICovariant<out R> //this is covariant
{
void DoSomething(Action<R> callback); //this is contravariant
}
在this msdn documentation关于协变和逆变中解释说out
关键字用于声明泛型参数协变。
You can declare a generic type parameter covariant by using the out keyword.
然后给出了out
关键字的用法的例子,然后就是这个语句里面说delegate作为方法参数是"contravariant",我think 应该叫 "covariant" 因为它仍然标有 out
:
There is one exception to this rule. If you have a contravariant generic delegate as a method parameter, you can use the type as a generic type parameter for the delegate.
那么这个例子如下:
interface ICovariant<out R>
{
void DoSomething(Action<R> callback);
}
委托参数不应该叫协变而是逆变吗?
从 Servy 的评论中我理解了这句话的意思,它不是逆变的接口,而是 Action<T>
是一个通用的逆变委托。所以msdn的文档是对的,当时我以为那句话是关于接口的泛型类型参数被认为是逆变的,这只是我的一个误会。是这样的:
interface ICovariant<out R> //this is covariant
{
void DoSomething(Action<R> callback); //this is contravariant
}