2011-06-06 30 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

関連する問題