将元素添加到 null(空)List<T> 属性
Add element to null (empty) List<T> Property
我遇到了问题。
问题是我试图将一个对象添加到此对象的列表中。
这个列表是 属性,没有错误,但是当我 运行 它在这一点上失败了,因为:
"NullReferenceException"。听起来合乎逻辑,因为列表的 属性 是 "null",但我不能声明 属性,可以吗?
她被剪掉了一些代码:
class Maps
{
protected virtual List<Ant> AllAntsAtMap { get; set; }
[...]
class Quadrangle : Maps
{
protected override List<Ant> AllAntsAtMap { get; set; }
public override void AddAntToMap(Ant ant)
{
AllAntsAtMap.Add(ant); //Error here
}
public override void AddAntsToMap(List<Ant> ants)
{
foreach (Ant ant in ants)
{
AddAntToMap(ant);
}
}
[...]
您应该在使用前初始化 AllAntsAtMap
。您可以为此使用构造函数:
public Quadrangle()
{
AllAntsAtMap = new List<Ant>();
}
Add element to null (empty) List Property
null
和一个空列表是两个不同的东西:将一个元素添加到一个空列表工作正常,但是如果你的 属性 是 null
(因为所有引用类型属性最初是 null
),您需要先用一个空列表对其进行初始化。
您可以为此使用自动 属性 初始化程序(请参阅 ),或者您可以在构造函数中手动初始化列表:
class Maps
{
public Maps()
{
AllAntsAtMap = new List<Ant>();
}
...
}
(因为 属性 是在超类 Maps 中声明的,所以我会在那里而不是在子类 Quadrangle 中进行初始化。)
在 C# 6 中更简单:
protected List<Ant> AllAntsAtMap { get; set; } = new List<Ant>();
添加之前需要实例化列表:
this.AllAntsAtMap = new List<AllAntsAtMap>();
在构造函数中初始化列表。
class Maps
{
protected virtual List<Ant> AllAntsAtMap { get; set; }
public Maps()
{
AllAntsAtMap = new List<Ant>();
}
}
您不需要覆盖 Quadrangle
中的列表 属性,除非您特别需要一个独立于基础 class 的列表。如果您在 child class 中有一个单独的列表,那么您需要在 child class 构造函数中初始化该列表。
如果基础 class 不应该有列表 属性 的实现,那么你应该将它设为 abstract
而不是 virtual
,并在child class 实现了 属性。
我遇到了问题。
问题是我试图将一个对象添加到此对象的列表中。 这个列表是 属性,没有错误,但是当我 运行 它在这一点上失败了,因为: "NullReferenceException"。听起来合乎逻辑,因为列表的 属性 是 "null",但我不能声明 属性,可以吗?
她被剪掉了一些代码:
class Maps
{
protected virtual List<Ant> AllAntsAtMap { get; set; }
[...]
class Quadrangle : Maps
{
protected override List<Ant> AllAntsAtMap { get; set; }
public override void AddAntToMap(Ant ant)
{
AllAntsAtMap.Add(ant); //Error here
}
public override void AddAntsToMap(List<Ant> ants)
{
foreach (Ant ant in ants)
{
AddAntToMap(ant);
}
}
[...]
您应该在使用前初始化 AllAntsAtMap
。您可以为此使用构造函数:
public Quadrangle()
{
AllAntsAtMap = new List<Ant>();
}
Add element to null (empty) List Property
null
和一个空列表是两个不同的东西:将一个元素添加到一个空列表工作正常,但是如果你的 属性 是 null
(因为所有引用类型属性最初是 null
),您需要先用一个空列表对其进行初始化。
您可以为此使用自动 属性 初始化程序(请参阅
class Maps
{
public Maps()
{
AllAntsAtMap = new List<Ant>();
}
...
}
(因为 属性 是在超类 Maps 中声明的,所以我会在那里而不是在子类 Quadrangle 中进行初始化。)
在 C# 6 中更简单:
protected List<Ant> AllAntsAtMap { get; set; } = new List<Ant>();
添加之前需要实例化列表:
this.AllAntsAtMap = new List<AllAntsAtMap>();
在构造函数中初始化列表。
class Maps
{
protected virtual List<Ant> AllAntsAtMap { get; set; }
public Maps()
{
AllAntsAtMap = new List<Ant>();
}
}
您不需要覆盖 Quadrangle
中的列表 属性,除非您特别需要一个独立于基础 class 的列表。如果您在 child class 中有一个单独的列表,那么您需要在 child class 构造函数中初始化该列表。
如果基础 class 不应该有列表 属性 的实现,那么你应该将它设为 abstract
而不是 virtual
,并在child class 实现了 属性。