La ragione per cui questo codice funziona è dovuto al fatto che il Enumerator
non possono modificare la raccolta:Perché la covarianza non è consentita con ReadOnlyCollection?
var roList = new List<string>() { "One", "Two", "Three" };
IEnumerable<object> objEnum = roList;
Se proviamo a fare la stessa cosa con un List<object>
, invece di IEnumerable<object>
, ci sarebbe un eloquente errore di compilazione noi che non possiamo convertire implicitamente il tipo List<string>
in List<object>
. Bene, questo ha senso ed è stata una buona decisione di Microsoft, a mio parere, come una lezione appresa dagli array.
Tuttavia, quello che non riesco a capire è perché nel mondo è questa regola hardline applicabile a qualcosa come ReadOnlyCollection
? Non saremo in grado di modificare gli elementi nello ReadOnlyCollection
, quindi qual è il problema di sicurezza che ha causato l'impossibilità Microsoft di utilizzare la covarianza con qualcosa di solo lettura? C'è un modo possibile di modificare quel tipo di raccolta che Microsoft stava cercando di rendere conto, ad esempio attraverso i puntatori?
"una lezione appresa dagli array": per quanto riguarda la covarianza dell'array, questa era in realtà una decisione di progettazione consapevole per consentirlo, perché Java ce l'aveva. Si è rivelata una pessima idea ... http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array- covariance.aspx –
@ThomasLevesque Buona lettura, grazie. –