Фиксированный размер в список - PullRequest
25 голосов
/ 26 октября 2009

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

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

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

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

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

Здесь я назначаю список для IList, каковы различные коллекции классы я могу назначить на IList?

Ответы [ 3 ]

42 голосов
/ 26 октября 2009

Основная проблема заключается в том, что 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>.

6 голосов
/ 26 октября 2009

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

list[0] = "a";
list[1] = "b";
list[2] = "c";
2 голосов
/ 26 октября 2009

@ Джейк: На самом деле строка [] может быть преобразована в IList ... но вы не можете ДОБАВИТЬ ее.

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

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

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

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