Un array tipizzato implementa entrambe le interfacce System.Collections.IList
e System.Collections.Generic.ICollection<T>
, che hanno entrambe le proprietà IsReadOnly
. Ma cosa diavolo sta succedendo qui?Array.IsReadSolo inconsistente a seconda dell'implementazione dell'interfaccia
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 IList
vista della matrice comporta come mi aspetto, restituendo lo stesso della matrice stessa, tuttavia la vista ICollection<T>
dell'array restituisce true.
C'è qualche spiegazione razionale per questo comportamento, o è un bug di compilatore/CLR? (Sarei davvero sorpreso se fosse il secondo come immagineresti sarebbe stato già trovato in passato, ma è così contro-intuitivo che non riesco a pensare a quale potrebbe essere la spiegazione ...).
Sto usando C# 3.0/.NET 3.5 SP1.
Interessante, le osservazioni per entrambi dicono "Una raccolta che è di sola lettura non consente l'aggiunta, la rimozione o la modifica di elementi dopo che la raccolta è stata creata.". E penso che la logica equivale a IsReadOnly =! CanAdd || ! CanRemove || ! CanEdit che dovrebbe restituire true perché è possibile sostituire il valore in un indice specificato della lista. –
a ma di più, ma il documento Array.IsReadonly è esplicito .. "Questa proprietà è sempre falsa per tutti gli array." "Array implementa la proprietà IsReadOnly perché è richiesta dall'interfaccia System.Collections .. ::. IList Se è necessaria una raccolta di sola lettura, utilizzare una classe System.Collections che implementa System.Collections .. ::. Interfaccia di IList Una matrice di sola lettura non consente l'aggiunta, la rimozione o la modifica di elementi dopo la creazione della matrice. " –