2015-09-10 373 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,並將其初始化爲實現該屬性的子類。