2015-09-10 121 views
0

我遇到了问题。将元素添加到空(空)列表<T>属性

问题是我尝试将对象添加到此对象的列表中。 这个列表是一个属性,没有错误,但是当我运行它时失败了,因为: “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); 
     } 
    } 

[...]

+1

为什么该属性是虚拟的,然后在派生类中重写的任何原因?你真的只需要申报一次。重写在这里没有任何好处。 – siride

回答

5

初始化在构造函数列表:

class Maps 
{ 
    public Maps() 
    { 
     AllAntsAtMap = new List<Ant>(); 
    } 

    ... 
} 

(由于属性在超类地图声明,我会做初始化出现,而不是在子类四合院)

2

你应该在使用前初始化AllAntsAtMap。您可以使用构造为:

public Quadrangle() 
{ 
    AllAntsAtMap = new List<Ant>(); 
} 
1

,它在C#6简单得多:

protected List<Ant> AllAntsAtMap { get; set; } = new List<Ant>(); 
+1

很酷,但他们可能不使用C#6. – siride

+1

这个假设是如何与问题相关的? –

1

你需要添加之前实例名单:

this.AllAntsAtMap = new List<AllAntsAtMap>(); 
1

在构造函数初始化列表。

class Maps 
{ 
    protected virtual List<Ant> AllAntsAtMap { get; set; } 

    public Maps() 
    { 
     AllAntsAtMap = new List<Ant>(); 
    } 

} 

你并不需要重写列表属性在Quadrangle除非特别需要从基类的单独列表。如果在子类中有单独的列表,那么您需要在子类构造函数中初始化该列表。

如果基类不应该具有list属性的实现,那么您应该将其设置为abstract而不是virtual,并将其初始化为实现该属性的子类。