情境:
class A { }
class B : A { }
class C<T> where T: A { }
问题
当B是A的子类时,为什么不能C<A> = C<B>
?
它抛出“无法隐式转换”错误
由于
- UPDATE -
我可以为C<A>
识别C<B>
吗?
答案 0 :(得分:3)
如果您需要执行此操作,请使用co-variant,并且因为 co-variant 仅适用于接口和委托,因此请使用魔术定义界面单词out
而不是类:
interface IC<out T> where T : A
{
}
所以,您可以按照自己的意愿分配:
class CA : IC<A>
{}
class CB : IC<B>
{ }
IC<A> x = new CA();
IC<B> y = new CB();
x = y;
答案 1 :(得分:0)
您要求的是泛型中的协方差和逆变,这仅适用于接口和代理。您可以查看this
您可以在Framework&gt; = 4:
中执行以下操作interface IC<out T> where T : A
class C<T> : IC<T> where T : A
IC<A> ica = new C<B>();
对于您的情况,您应该提取class C
答案 2 :(得分:0)
Why cant C<A> = C<B> when B is a subclass of A?
B
是A
的子类,但C<B>
不是C<A>
的子类。 C<B>
和C<A>
之间没有任何分配兼容性。
答案 3 :(得分:0)
因为C<A>
不是C<B>
事情是;如果你能做到
C<A> myA = new C<B>();
myA.Add(new A());
您遇到问题,因为B is A
,而不是A is B