设想:
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 ,并且因为co-variant仅适用于interface 和 delegate,因此使用魔术词out
而不是 class 定义接口:
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;
您要求的是泛型中的协变和逆变,它仅适用于接口和委托。你可以检查这个
您可以在 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