我是C#的新手。 我有一个父类声明:
class PmdTable
{
}
我有一个儿童班
class PmdSdStageCfg : PmdTable
{
现在它抱怨我是否愿意:
List<OracleObject.PmdTable> instanceList = new List<PmdSdStageCfg>();
我收到此错误
无法将类型'System.Collections.Generic.List'隐式转换为'System.Collection.Generics.List'。
因为PmdTable是父类。为什么这不起作用?
答案 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());