2009-10-26 2 views
24

Для перспективы декларации следующее допускаетсяФикс.разм к списку

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>(); 

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

ответ

41

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

+0

Словарь реализует ICollection , а не IList thecoop

+0

@thecoop, good catch, updated – JaredPar

6

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

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

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

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

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

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