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
对象传递给构造函数,所以构造函数将自身添加到 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);
打印零。
为什么只有当我在子类中覆盖它时,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
对象传递给构造函数,所以构造函数将自身添加到 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);
打印零。