2009-10-26 21 views
24

Per la prospettiva dichiarazione seguente è consentitoDimensione fissa la lista

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

1) Si compila bene, ma io sono sempre runtime "Collection was of fixed size" errore. Naturalmente, la raccolta è cresciuta dinamicamente in base alle dimensioni, perché tale dichiarazione è stata accettata dal compilatore?

2) Quali sono le diverse liste che posso assegnare a IList? Esempio

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

Qui Sto assegnando List per IList, Quali sono le varie collezione classi posso assegnare a IList?

risposta

41

Il problema fondamentale è che System.Array viola il principio di sostituzione implementando IList<T>. Un tipo System.Array ha una dimensione fissa che non può essere modificata. Il metodo Aggiungi su IList<T> ha lo scopo di aggiungere un nuovo elemento alla raccolta sottostante e aumentarne la dimensione di 1. Ciò non è possibile per un System.Array e quindi genera.

Ciò che System.Array vuole veramente implementare qui è uno stile di sola lettura IList<T>. Sfortunatamente nessun tipo di questo tipo esiste nel framework e quindi implementa la prossima cosa migliore: IList<T>.

Per quanto riguarda la domanda su ciò che tipi sono assegnabili a IList<T>, ci sono in realtà un bel po 'tra cui: ReadOnlyCollection<T> e Collection<T>. L'elenco è troppo lungo per essere inserito qui. Il modo migliore per vedere tutto è quello di aprire IList<T> nel riflettore e cercare i tipi derivati ​​di IList<T>.

+0

Dizionario implementa ICollection , non IList thecoop

+0

@thecoop, buona cattura, aggiornato – JaredPar

6

Quando si chiama list.Add, si sta tentando di inserire un elemento alla fine dell'array. Le matrici sono una collezione di dimensioni fisse, quindi non puoi fare un add. Invece si dovrà assegnare le voci tramite l'indicizzatore:

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

@Jake: In realtà una stringa [] può essere addebitata a un IList ... ma non è possibile AGGIUNGERE ad essa.

Se si vuole pre-compilare l'elenco, allora si potrebbe uso qualcosa di simile:

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

ma allora qual è il punto di renderlo un IList? Non puoi ancora aggiungerlo. Se in realtà è un elenco di dimensioni fisse, trasformalo in una stringa []. Altrimenti, rendilo un elenco(), come suggerisce Jake.

Problemi correlati