2009-10-26 8 views
24

Pour déclaration perspective qui suit est autoriséTaille fixe à la liste

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

1) Il compile très bien, mais je reçois l'exécution "Collection was of fixed size" erreur. Bien sûr, la collection est développée dynamiquement par taille, pourquoi cette déclaration a-t-elle été acceptée par le complicateur?

2) Quelles sont les différentes listes que je peux attribuer à IList? Exemple

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

Ici, je suis à la liste IList assigne, quelles sont les différentes classes peuvent collection i affecter à IList? Lorsque vous appelez list.Add, vous essayez d'insérer un élément à la fin de votre tableau.

Répondre

41

Le problème sous-jacent est ici que System.Array viole le principe de substitution par la mise en œuvre IList<T>. Un type System.Array a une taille fixe qui ne peut pas être modifiée. La méthode Add sur IList<T> est destinée à ajouter un nouvel élément à la collection sous-jacente et à augmenter sa taille de 1. Cela n'est pas possible pour un System.Array et par conséquent il se lève.

Ce que System.Array veut vraiment implémenter ici est un style en lecture seule IList<T>. Malheureusement, aucun type de ce type n'existe dans le framework et par conséquent il implémente la meilleure chose suivante: IList<T>. En ce qui concerne la question de savoir quels types sont assignables à IList<T>, il y en a en fait un certain nombre, y compris: ReadOnlyCollection<T> et Collection<T>. La liste est trop longue à mettre ici. La meilleure façon de tout voir est d'ouvrir IList<T> dans le réflecteur et chercher les types dérivés de IList<T>.

+0

Dictionnaire implémente ICollection , pas IList thecoop

+0

@thecoop, bonne prise, mise à jour – JaredPar

6

Les tableaux sont une collection de taille fixe donc vous ne pouvez pas faire un ajout. Au lieu de cela, vous devez attribuer les entrées via l'indexeur:

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

@Jake: En fait, une chaîne [] EST convertible en IList ... mais vous ne pouvez pas l'ajouter.

Si vous souhaitez pré-remplir la liste, vous pourrait utiliser quelque chose comme:

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

mais quel est le point d'en faire un IList? Vous ne pouvez toujours pas y ajouter. Si c'est vraiment une liste de taille fixe, alors faites-en une chaîne []. Sinon, faites-en un List(), comme le suggère Jake.

Questions connexes