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

C# - why am I getting an empty collection?

为什么只有当我在子类中覆盖它时,people 集合才会有项目?这是代码。如果我取消注释覆盖的方法,那么我的集合中有 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);
Thing park = new Park();

此处您实例化了一个 Park 对象并将其分配给一个类型为 Thing 的变量。到目前为止,还不错。

park = new PersonA(park);

此处您正在实例化一个 PersonA,并且因为您将 Park 对象传递给构造函数,所以构造函数将自身添加到 ParkPeople 集合中.所以该集合现在包含一个人。再一次,到目前为止,一切都很好。

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

关键的是,此时park.People并不是指Park对象的人的集合;引用PersonA对象的人物集合,为空

park = new PersonB(park);

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

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

Console.WriteLine(park.people.Count);

打印零。