2

设想:

class A { }

class B : A { }

class C<T> where T: A { }

问题

为什么C<A> = C<B>当 B 是 A 的子类时不能?它抛出“无法隐式转换”错误

谢谢

--UPDATE--C<A>我可以创建一个可以识别 的隐式方法C<B>吗?

4

4 回答 4

3

如果您需要这样做,请使用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;
于 2013-02-07T09:24:50.367 回答
0

您要求的是泛型中的协变和逆变,它仅适用于接口和委托。你可以检查这个

您可以在 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

于 2013-02-07T09:22:03.693 回答
0

Why cant C<A> = C<B> when B is a subclass of A? B是 的子类A,但C<B>不是 的子类C<A>C<B>和之间没有赋值兼容性 C<A>

于 2013-02-07T09:22:20.813 回答
0

因为C<A>不是C<B>

事情是; 如果你能做到

C<A> myA = new C<B>();
myA.Add(new A());

你会遇到问题,因为B is A,但不是A is B

于 2013-02-07T09:24:14.020 回答