Инициализировать IList <T>C # - PullRequest
       17

Инициализировать IList <T>C #

18 голосов
/ 28 августа 2009

Есть ли конкретный способ инициализации IList<T>? Это не похоже на работу:

IList<ListItem> allFaqs = new IList<ListItem>();
// Error I get here: Cannot create an instance of the interface 'IList<ListItem>'

ReSharper предлагает инициализировать его так:

IList<ListItem> allFaqs = null;

Но не приведет ли это к исключению Null Reference, когда я добавлю элементы в этот список?

Или мне просто использовать List<ListItem>?

Спасибо!

Ответы [ 8 ]

44 голосов
/ 28 августа 2009

Ошибка в том, что вы пытаетесь создать экземпляр интерфейса .

Измените свой код на:

List<ListItem> allFaqs = new List<ListItem>();

или

IList<ListItem> allFaqs = new List<ListItem>();

и он должен скомпилироваться.

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

Вы можете создать любой конкретный тип, который реализует IList, как это, поэтому

IList<ListItem> test = new ListItem[5];

IList<ListItem> test = new ObservableCollection<ListItem>(allFaqs);

и так далее, все будет работать.

16 голосов
/ 28 августа 2009

Ваша проблема в том, что IList - это интерфейс, а не класс. Вы не можете инициализировать интерфейс.

Вы можете иметь экземпляр интерфейса, но вам нужно инициализировать его с помощью класса, который реализует этот интерфейс, например:

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

Предыдущая строка кода будет работать, но вам будут доступны только члены IList вместо полного набора из любого класса, который вы инициализируете.

6 голосов
/ 28 августа 2009

IList - это не класс; это интерфейс, который могут реализовать классы. Сам интерфейс является просто контрактом между потребителем класса и самим классом. Эта строка кода будет работать:

IList<ListItem> allFaqs = new List<ListItem>();

Помогает ли это?

2 голосов
/ 28 августа 2009

IList - это интерфейс, а не класс. Если вы хотите инициализировать его, вам нужно инициализировать его классом, реализующим IList, в зависимости от ваших внутренних потребностей. Обычно IList инициализируется списком.

IList<ListItem> items = new List<ListItem>();
2 голосов
/ 28 августа 2009

Нельзя создать экземпляр интерфейса (IList - это интерфейс).

Вам нужно создать экземпляр того, что реализует IList,

вроде так:

IList<ListItem> allFaqs = new List<ListItem>();

Существуют и другие виды ILists, но для начала лучше всего использовать List.

2 голосов
/ 28 августа 2009

IList - это интерфейс, поэтому вы не можете создать его экземпляр. Все виды классов реализуют IList. Одним из таких классов, который реализует IList, является List. Вы можете создать его так:

List<ListItem> allFaqs = new List<ListItem>();
2 голосов
/ 28 августа 2009

Вам нужно сделать:

IList<ListItem> allFaqs = new List<ListItem>();

В вашем коде вы пытаетесь инициализировать интерфейс.

1 голос
/ 28 августа 2009

IList<T> - это интерфейс. Вам нужно создать экземпляр класса, который реализует интерфейс:

IList<ListItem> allFaqs = new List<ListItem>();

List<T> реализует IList<T> и может быть присвоено переменной. Есть и другие типы, которые также реализуют IList<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...