class A { }
class B : A { }
class C<T> where T: A { }
问题
为什么不能C<A> = C<B>
当B是A的子类? 它抛出了“不能隐式转换”错误
感谢
--UPDATE-- 我可以创建为C<A>
将承认C<B>
一个隐含的方法?
class A { }
class B : A { }
class C<T> where T: A { }
问题
为什么不能C<A> = C<B>
当B是A的子类? 它抛出了“不能隐式转换”错误
感谢
--UPDATE-- 我可以创建为C<A>
将承认C<B>
一个隐含的方法?
使用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;
您要求的是泛型中的协变和逆变,它只适用于接口和代表。您可以检查this
你可以在Framework> = 4如下:
interface IC<out T> where T : A
class C<T> : IC<T> where T : A
IC<A> ica = new C<B>();
对于你的情况,你应该提取接口class C
Why cant C<A> = C<B> when B is a subclass of A?
B
是A
子类,但C<B>
没有C<A>
的子类。 C<B>
和C<A>
之间没有赋值兼容性。
因为C<A>
不C<B>
的东西是;如果你能做到
C<A> myA = new C<B>();
myA.Add(new A());
你就会有一个问题,因为B is A
,但不A is B
请重新阅读你的问题。什么意思_“为什么不能C = C”_?提供一个编译代码片段,使我们能够重现您的问题。 –
C = C是什么意思? –
请参阅http://stackoverflow.com/questions/674715/net-casting-generic-list和http://stackoverflow.com/questions/1133356/why-does-this-generic-cast-fail/1133389。你正在寻找的关键字是协变和反变化:) –