C#:没有从Class <child>到Class <base /> </child>的隐式转换

时间:2009-06-11 14:51:01

标签: c# generics inheritance language-features language-design

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

  

无法隐式转换类型'Container&lt; ChildClass&gt;'到'Container&lt; BaseClass&gt;'

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

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

4 个答案:

答案 0 :(得分:14)

(制作wiki,如果有重复)

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

问题在于:

Container<BaseClass> obj = new Container<ChildClass>(); 

我能做到:

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

会编译,但不起作用。

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

答案 1 :(得分:4)

哟,

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

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

这与Breaking Bad一样好。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

  

无法隐式将Container<ChildClass>类型转换为Container<BaseClass>

MyClass<Child>继承了MyClass<Base>,这是一种非常常见的误解。