c# -为什么我得到一个空集合

本文关键字:一个 空集 集合 为什么 | 更新日期: 2023-09-27 18:01:48

为什么只有当我在子类中重写它时,人们集合中才有项目?下面是代码。如果我取消重写的方法的注释,那么我的集合中有2个人。

public class Park : Thing
{
}
public abstract class Thing
{
    public virtual List<Thing> people { get; } = new List<Thing>();
}
public class PersonA : Thing
{
    Thing p;
    public string Name { get; set; }
    public PersonA(Thing p)
    {
        this.p = p;
        Name = "Marry";
        this.p.people.Add(this);
    }
    //public override List<Thing> people => p.people;
}
public class PersonB : Thing
{
    Thing p;
    public string Name { get; set; }
    public PersonB(Thing p)
    {
        this.p = p;
        Name = "Joe";
        this.p.people.Add(this);
    }
    //public override List<Thing> people => p.people;
}

下面是测试程序:

Thing park = new Park();
park = new PersonA(park);
park = new PersonB(park);
Console.WriteLine(park.people.Count);

c# -为什么我得到一个空集合

Thing park = new Park();

这里你正在实例化一个Park对象,并将其分配给一个类型为Thing的变量。到目前为止,一切顺利。

park = new PersonA(park);

这里您正在实例化PersonA,并且由于您将Park对象传递给构造函数,构造函数将自己添加到ParkPeople集合中。所以这个集合现在包含一个人。到目前为止,一切顺利。

但是,您随后将新的PersonA对象赋值给park变量。这不是一个运行时错误,因为变量的类型是Thing,而PersonAThing,但几乎可以肯定这是一个逻辑错误,因为我无法想象为什么你想要一个名为park的变量来指代一个人。

关键的是,在这一点上,park.People不是指Park对象的人的集合;它指向PersonA对象的人的集合,该集合为空。

park = new PersonB(park);

现在当你调用PersonB构造函数时,你不是在传递一个Park对象;您将把分配给park变量的PersonA对象传递给它。因此,PersonB构造函数将自己添加到PersonAPeople集合中,该集合现在包含一个人。

但是,您再次将结果分配给park。所以现在park包含一个PersonB对象,它的People集合是空的。这就是为什么这个:

Console.WriteLine(park.people.Count);

打印零。