简单协方差似乎不适用于 c# 泛型



在我看来,我对c#中的协方差有一个理解问题。如果我有以下类:

class a {
}
class b : a {
}
class A<T> where T: a {
}
class B<T> : A<T> {
}
class C : A<b> {
}

现在我做了:

A<a> t1 = new B<b>();
A<a> t2 = new C();

这两个都不起作用,但为什么呢??这篇来自微软的文章不是建议,这应该是工作吗?http://msdn.microsoft.com/de-de/library/dd799517 (v = vs.110) . aspx

为什么这个非常简单的例子不起作用?

协方差的工作原理就像你描述的那样,但有一个重要的部分:

泛型类只有从接口继承时才协变在协变泛型参数上用"out"关键字标记。

关于如何使用它有很多规则,详见MSDN。

您没有继承协变接口,因此您的派生赋值将中断。

你需要这样写:

IGeneric<out T>
{
}
class a<T> : IGeneric<T>
{
}

等等。只要你的作业看起来像:

IGeneric<Base> = a<Derived>