重新定义列表的内容类型

时间:2018-08-22 18:00:22

标签: c# list

好的,这可能是用严格类型的编程语言提出的另一个愚蠢的问题,但是...

public class Parent
{
    public List<Parent> list_of = new List<Parent>;
}

public class Child : Parent
{
    public List<Child> list_of = new List<Child>;
}

基本上,我要问的是,是否可以在子类中更改列表的“内容”类型?

1 个答案:

答案 0 :(得分:1)

基本上没有。关于覆盖:

  • 无法覆盖字段
  • 您可以覆盖virtual属性或函数
  • 覆盖任何内容(甚至通用类型的类型参数)时也不能更改类型

但是您可以使用new关键字隐藏字段/属性/功能并更改类型:

public class Parent
{
    public List<Parent> ListOf = new List<Parent>();
}

public class Child : Parent
{
    public new List<Child> ListOf = new List<Child>();
}

这不是覆盖,您仍然可以访问Parent的{​​{1}}字段,但前提是您将ListOf强制转换为Child

此外,应该提及的是,只有Parent类型是协变的(声明为ISomeGeneric<Child>),才可以将ISomeGeneric<Parent>类型视为ISomeGeneric<out T>类型。 List<T>不是协变(here's why),因此List<Child>不能被视为List<Parent>,这是两种不同的类型。 但是IEnumerable<T>是协变的,因此您可以将ListOf设置为属性,将其类型更改为IEnumerable<Parent>,并在派生类中使用IEnumerable<Child>对其进行实例化:

public class Parent
{
    public virtual IEnumerable<Parent> ListOf { get; set; } = new List<Parent>();
}

public class Child : Parent
{
    public override IEnumerable<Parent> ListOf { get; set; } = new List<Child>();
}

但即使在覆盖时,也无法将属性类型IEnumerable<Parent>更改为IEnumerable<Child>