2009-10-26 16 views
24

Para ponerlo en perspectiva declaración de la siguiente está permitidoTamaño fijo en lista

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

1) Se compila bien, pero en tiempo de ejecución que estoy recibiendo "Collection was of fixed size" error. Por supuesto, la colección se cultiva dinámicamente por tamaño, ¿por qué tal declaración fue aceptada por el compilador?

2) ¿Cuáles son las diferentes listas que puedo asignar a IList? Ejemplo

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

Aquí estoy asignando Lista de IList, ¿Cuáles son las diversas clases de colección puedo asignar a IList?

Respuesta

41

El problema subyacente aquí es que System.Array viola el principio de sustitución mediante la implementación de IList<T>. Un tipo System.Array tiene un tamaño fijo que no se puede cambiar. El método Agregar en IList<T> está destinado a agregar un nuevo elemento a la colección subyacente y aumentar su tamaño en 1. Esto no es posible para un System.Array y, por lo tanto, arroja.

Lo que System.Array realmente quiere implementar aquí es un estilo de solo lectura IList<T>. Lamentablemente, no existe tal tipo en el marco y, por lo tanto, implementa la siguiente mejor opción: IList<T>.

En cuanto a la pregunta acerca de qué tipos son asignables a IList<T>, en realidad hay un buen número de ellos: ReadOnlyCollection<T> y Collection<T>. La lista es demasiado larga para poner aquí. La mejor manera de verlo todo es abrir IList<T> en el reflector y buscar los tipos derivados de IList<T>.

+0

Diccionario implementa ICollection , no IList thecoop

+0

@thecoop, good catch, updated – JaredPar

6

Cuando llama a list.Add, está tratando de insertar un elemento al final de su matriz. Las matrices son una colección de tamaño fijo por lo que no puede hacer un Agregar. En su lugar se tiene que asignar las entradas a través del controlador paso a paso:

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

@Jake: En realidad, una cadena [] ES se puede convertir en IList ... pero no se puede AGREGAR.

Si desea pre-rellenar la lista, entonces usted podría usar algo como:

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

pero entonces ¿cuál es el punto de convertirlo en un IList? Aún no puedes agregar nada. Si realmente es una lista de tamaño fijo, conviértala en una cadena []. De lo contrario, conviértalo en una Lista(), como sugiere Jake.

Cuestiones relacionadas