C#Generic Class Type参数(不能隐式转换)

时间:2013-02-07 09:17:39

标签: c# generics types parameters implicit-conversion

情境:

class A { }

class B : A { }

class C<T> where T: A { }

问题

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

由于

- UPDATE - 我可以为C<A>识别C<B>吗?

创建隐式方法

4 个答案:

答案 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? BA的子类,但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