使用子类对象列表分配父类引用列表不起作用

时间:2013-10-01 21:22:36

标签: c# list

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

class PmdTable
{
}

我有一个儿童班

class PmdSdStageCfg : PmdTable
{

现在它抱怨我是否愿意:

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

我收到此错误

  

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

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

2 个答案:

答案 0 :(得分:3)

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

有关详细信息,请参阅Covariance and Contravariance in Generics

如果允许这样做,你就能完全无效:

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

答案 1 :(得分:1)

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

由于您是C#的新手,这可能意义不大。使收藏品以类型安全的方式工作是一种令人讨厌的副作用。你得到的结论是你写的东西不能编译,但是下面的工作会很好:

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