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);
Thing park = new Park();
这里你正在实例化一个Park
对象,并将其分配给一个类型为Thing
的变量。到目前为止,一切顺利。
park = new PersonA(park);
这里您正在实例化PersonA
,并且由于您将Park
对象传递给构造函数,构造函数将自己添加到Park
的People
集合中。所以这个集合现在包含一个人。到目前为止,一切顺利。
但是,您随后将新的PersonA
对象赋值给park
变量。这不是一个运行时错误,因为变量的类型是Thing
,而PersonA
是Thing
,但几乎可以肯定这是一个逻辑错误,因为我无法想象为什么你想要一个名为park
的变量来指代一个人。
关键的是,在这一点上,park.People
不是指Park
对象的人的集合;它指向PersonA
对象的人的集合,该集合为空。
park = new PersonB(park);
现在当你调用PersonB
构造函数时,你不是在传递一个Park
对象;您将把分配给park
变量的PersonA
对象传递给它。因此,PersonB
构造函数将自己添加到PersonA
的People
集合中,该集合现在包含一个人。
但是,您再次将结果分配给park
。所以现在park
包含一个PersonB
对象,它的People
集合是空的。这就是为什么这个:
Console.WriteLine(park.people.Count);
打印零。