ошибка: ссылка на объект не инициализирована

У меня есть следующий код на C #:

IList<string> myList = null;
myList.Add (temp);

temp - это строка, которая помечена где-то в другом месте и не является нулем (я это проверил). Я получаю следующую ошибку в строке myList.Add (temp); «Ссылка на объект не инициализирована экземпляром объекта»

Что я здесь делаю не так ???

Обновление вопроса: я уже пробовал новый
IList<string> myList = new List_3 _> ();
, как предлагали многие из вас, и получил от Intellisense следующее:

Невозможно создать экземпляр абстрактного класса или интерфейса Systems.Collections.Generic.Ilist.

Спасибо за ваши предыдущие ответы. Теперь я столкнулся со своеобразной проблемой. В моем устройстве чтения данных есть пустая строка. (1 поле в таблице sql server пустое. Это строка. Пусто). Есть ли способ избавиться от этого внутри ридера (я имею в виду rdr здесь) ??


person zack    schedule 25.10.2010    source источник
comment
если (! string.IsNullOrEmpty (temp)) myList.Add (temp);   -  person Mark Avenius    schedule 26.10.2010


Ответы (4)


Линия:

IList<string> myList = null;

не дает вам список, а дает пустую ссылку на то, где может быть список.

IList<string> myList = new List<string>();

будет правильно создавать экземпляр myList, чтобы вы могли его использовать (Добавить, Удалить и т. д.).

person Mark Avenius    schedule 25.10.2010
comment
IList ‹string› - это не класс, а интерфейс, поэтому вы не можете создать его экземпляр. Однако вы можете создать экземпляр List ‹string›, который реализует IList ‹string›: IList<string> myList = new *List*<string>(); - person Mark Avenius; 26.10.2010

вам нужно сначала инициализировать список:

IList<string> myList = new List<string>();
...

Обратите внимание, что справа от = вы должны написать List<string>, а не IList<string>, поскольку IList<string> - это интерфейс, а List<string> - это класс, реализующий этот интерфейс.

person Klaus Byskov Pedersen    schedule 25.10.2010
comment
Ага. Я не делал новый IList ‹string› (); Спасибо. - person zack; 26.10.2010

Взгляните на это руководство, чтобы лучше понять инициализацию переменных.

Из http://www.csharphelp.com/2007/03/objects-classes-in-c/

Person Michael = new Person();

В первой строке кода мы указали целочисленную переменную age. Во второй строке мы сначала указали тип объекта, который нам нужно создать, за которым следует имя объекта, за которым следует зарезервированный оператор с именем new, и в конце мы снова набираем имя класса, за которым следует скобка «()».

Давайте разбираться в этом шаг за шагом. Указание имени класса в начале указывает компилятору C # выделить место в памяти для этого типа (компилятор C # знает все переменные, свойства и методы класса, поэтому он выделит правильный объем памяти). Затем мы следовали за именем класса по имени переменной объекта, которое нам нужно. Остальная часть кода ”= new Person ();” вызвать конструктор объекта. Мы поговорим о конструкторе позже, но пока поймите, что конструктор - это способ инициализировать переменную вашего объекта, пока вы ее создаете, а не после того, как вы ее создали. Например, объект Michaelobject, который мы создали в предыдущем разделе, можно записать следующим образом:

Person Michael = new Person(20, “Brown”);

здесь я указал значения переменных в списках параметров, поэтому я инициализировал переменные при создании объекта. Но для того, чтобы этот код работал, нам нужно будет указать конструктор в классе Person, и я не буду делать этого здесь, потому что раздел конструктора появится в следующих статьях. Я думаю, что вы получили хорошее введение о классах и объектах, которое я не завершу в своей следующей статье, и я расскажу о конструкторах и построении блоков. Надеюсь, вы получили обновку из моей статьи.

person Aaron    schedule 25.10.2010

Обновление вопроса: я уже пробовал new Ilist (), как предлагали многие из вас, и получил от Intellisense следующее: Невозможно создать экземпляр абстрактного класса или интерфейса Systems.Collections.Generic.Ilist

Вы не можете создавать экземпляры интерфейса. IList ‹T› - это интерфейс. Как здесь уже говорили другие, вы инициализируете его экземпляром конкретного класса, наследующего интерфейс. Обратите внимание, как они используют новый List ‹String› (), а не новый IList ‹String› ();

IList<String> items = new List<String>();
person Brian    schedule 25.10.2010
comment
да, извините, я видел комментарии других парней после того, как отправил это = P. Поверьте, мы все делали это раньше. - person Brian; 26.10.2010