Подтвердить что ты не робот

Фиксированный размер для списка

Для перспективы объявления допускается следующее

    IList<string> list= new string[3];
    list.Add("Apple");
    list.Add("Manago");
    list.Add("Grapes");

1) Он компилируется отлично, но во время выполнения я получаю ошибку "Collection was of fixed size". Конечно, коллекция динамически растет по размеру, почему такая декларация была принята complier?

2) Каковы разные списки, которые я могу назначить IList?  Пример

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

Здесь я назначаю List to IList, Какую различную коллекцию  классы можно назначить IList?

4b9b3361

Ответ 1

Основная проблема заключается в том, что System.Array нарушает принцип подстановки путем реализации IList<T>. Тип System.Array имеет фиксированный размер, который нельзя изменить. Метод Add на IList<T> предназначен для добавления нового элемента в базовую коллекцию и увеличения его размера на 1. Это невозможно для System.Array и, следовательно, оно выбрасывает.

Что System.Array действительно хочет реализовать здесь, это стиль только для чтения IList<T>. К сожалению, такого типа нет в структуре, и поэтому он реализует следующее лучшее: IList<T>.

Что касается вопроса о том, какие типы присваиваются IList<T>, на самом деле существует немало, включая: ReadOnlyCollection<T> и Collection<T>. Список слишком длинный, чтобы поместить здесь. Лучший способ увидеть это - открыть IList<T> в отражателе и искать производные типы IList<T>.

Ответ 2

Когда вы вызываете list.Add, вы пытаетесь вставить элемент в конец вашего массива. Массивы представляют собой коллекцию фиксированного размера, поэтому вы не можете добавлять. Вместо этого вам придется назначать записи с помощью индексатора:

list[0] = "a";
list[1] = "b";
list[2] = "c";

Ответ 3

@Jake: На самом деле строка [] доступна для IList... но вы не можете добавить к ней.

Если вы хотите предварительно заполнить список, вы можете использовать что-то вроде:

IList<string> list= new string[3] { "Apple", "Mango", "Grapes" };

но какой смысл сделать это IList? Вы все еще не могли добавить к нему. Если это действительно список фиксированного размера, сделайте его строкой []. В противном случае сделайте его List(), как предлагает Джейк.