C#:没有从Class 到Class 的转换

以下代码片段无法编译。 出现以下错误:

无法将类型’Container ‘隐式转换为’Container ‘

class BaseClass {} class ChildClass : BaseClass {} class Container where T : BaseClass {} class Program { static void Main() { // why doesn't this work? Container obj = new Container(); } } 

这是设计的吗? 如果是,那是什么原因?

(制作wiki,如果有重复)

C#(3.0)不支持列表等的协方差.C#4.0将支持有限的 [co | contra]方差,但仍不支持列表 。

问题在于:

 Container obj = new Container(); 

我可以:

 obj.Add(new SomeOtherSubclass()); // SomeOtherSubclass : BaseClass 

哪个会编译,但不起作用。

arrays支持此行为,但主要是出于历史原因。

哟,

如果你想要关于C#的协方差/逆变的杀手文章,请查看eric lippert博客,“编码中的精彩冒险”。 首先,这是我最喜欢的博客的名字,第二个eric写了关于(co | contra)方差的最佳文章序列:

http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx

这和Breaking Bad一样好。

这就是所谓的协方差/逆变,这是C#3.0所不具备的。 它将在C#4.0中有所提供。 这是一些信息:

http://reddevnews.com/articles/2009/05/01/generic-covariance-and-contravariance-in-c-40.aspx

无法将类型Container隐式转换为Container

MyClassinheritance自MyClass这是一种非常常见的错误概念。