在我看来,我对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>