2013-02-07 65 views
2

场景:C#泛型类的类型参数(不能隐式转换)

class A { } 

class B : A { } 

class C<T> where T: A { } 

问题

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

感谢

--UPDATE-- 我可以创建为C<A>将承认C<B>一个隐含的方法?

+1

请重新阅读你的问题。什么意思_“为什么不能C = C”_?提供一个编译代码片段,使我们能够重现您的问题。 –

+0

C = C是什么意思? –

+0

请参阅http://stackoverflow.com/questions/674715/net-casting-generic-list和http://stackoverflow.com/questions/1133356/why-does-this-generic-cast-fail/1133389。你正在寻找的关键字是协变和反变化:) –

回答

3

使用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; 
0

您要求的是泛型中的协变和逆变,它只适用于接口和代表。您可以检查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

0

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

0

因为C<A>C<B>

的东西是;如果你能做到

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

你就会有一个问题,因为B is A,但不A is B