Списки + Структуры: ссылка на объект не установлена ​​на экземпляр объекта - PullRequest
2 голосов
/ 06 июня 2011

Я получаю эту ошибку с этим кодом:

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.

Ответы [ 2 ]

5 голосов
/ 06 июня 2011

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

public Messages(SpriteBatch spriteBatch)
{
    sb = spriteBatch;
    msgList = new List<Msg>(); // correct way
}
3 голосов
/ 06 июня 2011

Не делайте этого в своем конструкторе:

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

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

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

msgList = new List<Msg>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...