将父类引用列表与子类对象列表一起分配不起作用

本文关键字:列表 一起 分配 不起作用 对象 父类 引用 子类 | 更新日期: 2023-09-27 18:33:27

我是C#的新手。我声明了一个父类:

class PmdTable
{
}

我有一个孩子班

class PmdSdStageCfg : PmdTable
{

现在它抱怨,如果我喜欢:

List<OracleObject.PmdTable> instanceList = new List<PmdSdStageCfg>();

我收到此错误

无法将类型"System.Collections.Generic.List"隐式转换为"System.Collection.Generics.List"。

因为 PmdTable 是父类。为什么这不起作用?

将父类引用列表与子类对象列表一起分配不起作用

不起作用List<T>因为不是协变的。

有关详细信息,请参阅泛型中的协方差和逆变。

如果允许这样做,您将能够执行完全无效的操作:

class OtherPmd : PmdTable {}
// NOTE: Non-working code below
// This will break, since it's actually a List<PmdSdStateCfg> 
// But it should be allowed, since instanceList is declared List<OracleObject.PmdTable> 
instanceList.Add(new OtherPmd()); 

技术答案是因为 List 不支持协方差。

由于您不熟悉 C#,这可能意义不大。这是使集合以类型安全的方式工作的令人讨厌的副作用。对你来说,结果是你正在编写的内容不会编译,但以下内容可以正常工作:

List<PmdTable> instanceList = new List<PmdTable>();
instanceList.Add(new PmdSdStageCfg());