C#:没有从 Class<Child> 到 Class<Base> 的隐式转换

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

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

Cannot implicitly convert type 'Container<ChildClass>' to 'Container<BaseClass>'

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>(); 
    }
}

这是设计使然吗?如果是,原因是什么?

最佳答案

(制作维基,以防重复)

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

问题在于:

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

我能做到:

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

可以编译,但不能工作。

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

关于C#:没有从 Class<Child> 到 Class<Base> 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/981570/

相关文章:

java - 向 Mockito.any() 提供类以使 verify() 调用明确的正确语法是什么?

scala - 关于 Java 和 Scala 中的泛型

generics - 在 Kotlin 中,是否可以将函数参数限制为 2 个类类型而不是 Any?

java - 无法从扩展类获取属性值

c# - 如何在 Excel 中的 SheetChange 事件中确定新的和以前的单元格值?

c# - 为什么我不能使用具有继承接口(interface)的相同泛型类型?

c# - 如何连接两个类型为 List<KeyValuePair<string,string>> 的 C# 列表。我有一些重复值,我需要这些重复值

C# - MS 测试 - 创建一个先运行另一个测试的测试

c# - 构建使用 Windows 7 任务栏功能的 C#/.NET 应用程序

c++ - 根据数据包类型更改行为,避免 switch 语句