Una matriz con tipo implementa las interfaces System.Collections.IList
y System.Collections.Generic.ICollection<T>
, que tienen sus propias propiedades IsReadOnly
. ¿Pero qué demonios está pasando aquí?Array.IsReadOnly inconsistente según la implementación de la interfaz
var array = new int[10];
Console.WriteLine(array.IsReadOnly); // prints "False"
var list = (System.Collections.IList)array;
Console.WriteLine(list.IsReadOnly); // prints "False"
var collection = (System.Collections.Generic.ICollection<int>)array;
Console.WriteLine(collection.IsReadOnly); // prints "True"
La vista IList
de la matriz se comporta como yo esperaría, volviendo la misma que la propia matriz, sin embargo la vista ICollection<T>
de la matriz devuelve verdadero.
¿Hay alguna explicación racional para este comportamiento, o es un error de compilación/CLR? (Me sorprendería mucho si es lo último, como imaginarían que esto ya se hubiera encontrado antes, pero es tan contrario a la intuición que no puedo pensar cuál podría ser la explicación ...).
Estoy usando C# 3.0/.NET 3.5 SP1.
Interesante, las observaciones de ambos dicen "Una colección que es de solo lectura no permite la adición, eliminación o modificación de elementos una vez creada la colección". Y creo que la lógica equivale a IsReadOnly =! CanAdd || ! CanRemove || ! CanEdit que debería devolver verdadero porque puede reemplazar el valor en un índice especificado de la lista. –
a pero más, pero el documento Array.IsReadonly es explícito .. "Esta propiedad siempre es falsa para todas las matrices." "La matriz implementa la propiedad IsReadOnly porque la requiere la interfaz System.Collections .. ::. IList Si necesita una colección de solo lectura, use una clase System.Collections que implemente System.Collections .. ::. Interfaz IList. Una matriz que es de solo lectura no permite la adición, eliminación o modificación de elementos una vez creada la matriz. " –