2009-10-26 13 views
24

do deklaracji perspektywie następnego wolnoFixed Size do listy

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

1) kompiluje dobrze, ale czas pracy otrzymuję "Collection was of fixed size" błąd. Oczywiście, kolekcja jest dynamicznie powiększana o rozmiar, dlaczego taka deklaracja została zaakceptowana przez kompilatora?

2) Jakie są różne listy, które mogę przypisać do ILIST? Przykład

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

Oto jestem przypisanie listy, aby IList, jakie są różne kolekcja zajęcia mogę przypisać do IList?

Odpowiedz

41

Podstawowym problemem jest to, że System.Array narusza zasadę substytucji poprzez wdrożenie IList<T>. Typ System.Array ma ustalony rozmiar, którego nie można zmienić. Metoda Add na IList<T> ma na celu dodanie nowego elementu do podstawowej kolekcji i zwiększenie jej rozmiaru o 1. Nie jest to możliwe dla System.Array, a zatem powoduje odrzucenie.

Co naprawdę chce zaimplementować tutaj, to System.Array w stylu tylko do odczytu IList<T>. Niestety tego typu nie ma w strukturze i dlatego implementuje następną najlepszą rzecz: IList<T>.

Jeśli chodzi o pytanie o typy, które można przypisać do IList<T>, w rzeczywistości jest ich sporo: ReadOnlyCollection<T> i Collection<T>. Lista jest zbyt długa, by ją tu umieścić. Najlepszym sposobem obejrzenia tego wszystkiego jest otwarcie IList<T> w odbłyśniku i poszukiwanie pochodnych typów IList<T>.

+0

Słownik implementuje ICollection , a nie IList thecoop

+0

@thecoop, dobry połów, aktualizacja – JaredPar

6

Po wywołaniu list.Add, próbujesz wstawić element do końca swojej tablicy. Tablice są zbiorem o ustalonej wielkości, więc nie można dodawać. Zamiast tego trzeba będzie przypisać wpisy za pośrednictwem indekser:

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

@Jake: Właściwie ciąg [] JEST odlewany na IList ... ale nie można go do niego dodać.

Jeśli chcesz wstępnie wypełnić listę, wtedy mógł użycie coś jak:

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

ale to co jest sens czyni go IList? Nadal nie możesz do niego dodać. Jeśli rzeczywiście jest to lista o ustalonej wielkości, należy ją napisać []. W przeciwnym razie utwórz List(), jak sugeruje Jake.

Powiązane problemy