2011-06-06 3 views
2

я получаю эту ошибку с этим кодом:Списки + Структуры: Ссылка на объект не указывает на экземпляр объекта

struct Msg 
{ 
    public int remove; 
    public string text; 
} 

public class Messages 
{ 
    #region Class Variables 
    protected SpriteBatch sb; 
    List<Msg> msgList; 
    #endregion 

    public Messages(SpriteBatch spriteBatch) 
    { 
     sb = spriteBatch; 
     List<Msg> msgList = new List<Msg>(); 
    } 

    public int Now() 
    { 
     return DateTime.Now.Second; 
    } 

    public void Add(string text, int keep = 5) 
    { 
     Msg temp = new Msg(); 
     temp.remove = Now() + keep; 
     temp.text = text; 
     msgList.Add(temp); 
    } 

    public void Draw() 
    { 
     int count = 0; 
     foreach (Msg msg in msgList) 
     { 
      if (msg.remove >= Now()) 
      { 
       msgList.Remove(msg); 
      } 
      else 
      { 
       count++; 
       sb.DrawString(Game1.SmallFont1, msg.text, new Vector2(10, 5 + count * 25), Color.White); 
      } 
     } 
    } 
} 

и именно тогда, когда это выполняется

 msgList.Add(temp); 

Это дает мне:

NullReferenceException was unhandled 
    Object reference not set to an instance of an object. 

ответ

4

Поле msgList; не инициализирован. В конструкторе вы объявили и инициализировали новую локальную переменную типа List<Msg>.

public Messages(SpriteBatch spriteBatch) 
{ 
    sb = spriteBatch; 
    msgList = new List<Msg>(); // correct way 
} 
+0

Да, я просто глуп :(Спасибо! – Lrdude

3

не делать это в конструкторе:

List<Msg> msgList = new List<Msg>(); 

Вы скрываете поле msgList с членом метода с тем же именем (то есть вы обновляете имя в конструкторе). По сути, вы никогда не инициализируете поле.

Оно должно быть:

msgList = new List<Msg>(); 
+0

Ах, вы правы! Большое спасибо. – Lrdude

Смежные вопросы