我有以下类:
public abstract class ParentCollection
{
public List<ParentObject> MyList { get; set; }
public ParentCollection(){}
}
ParentObject
有一个继承自它的子类,ChildObject
. ParentCollection
还具有以下子类:
public class ChildCollection : ParentCollection
{
public ChildCollection() : base()
{
this.MyList = new List<ChildObject>();
}
private void Filter()
{
this.MyList = this.Objects.Where(p => p.Age > 18).ToList();
}
}
this.MyList = new List<ChildObject>();
的台词正在抛出Cannot implicitly convert type error
.Filter()
方法也会引发类型错误。
我的理解是,父对象列表应该允许使用子对象进行实例化,因为该对象继承自父对象。
这里的问题是,虽然ChildObject
可以是ParentObject
的孩子,List<ChildObject>
不是List<ParentObject>
的孩子。 List<ChildObject>
是 List
类型的对象,List<ParentObject>
你可以像这样改变你的ParentCollection
来实现你想要的。
abstract class ParentCollection
{
public IEnumerable<ParentObject> MyList { get; set; }
public ParentCollection() { }
}
您可能还想研究协变和逆变。
问题在于,允许通过基接口对派生类型的列表进行写入访问可以让您将错误类型的对象添加到列表中。
但是,如果只需要对列表的枚举读取访问权限,则可以执行以下操作:
public abstract class ParentCollection
{
public IEnumerable<ParentObject> MyList
{
get;
set;
}
public ParentCollection()
{
}
}