Le collezioni tipizzate hanno il pregio di permettere al compilatore di scoprire più bug già in compilazione
Per esempio il compilatore C# dovrebbe accorgersi del errore di questo codice grazie ai generics?
interface IPersistent { ... }
class Invoice : IPersistent { ... }
class Order : IPersistent { ... }
...
List<IPersistent> changedDocuments = new List<IPersistent>();
...
changedDocuments.Add(anInvoice);
changedDocuments.Add(anOrder);
...
foreach (Invoice changedInvoice in changedDocuments)
{
...
}
La risposta è no perché tenta un downcast, ecco il codice IL:
L_002b: call instance !0 [mscorlib]System.Collections.Generic.List`1/Enumerator<class IPersistent>::get_Current()
L_0030: castclass Invoice
Credevo di avere le allucinazioni, un attimo di distrazione, insieme a due colleghi curiosi degli internals del linguaggio abbiamo invece capito che è proprio cosi
Questo funzionamento è contro-intuitivo e anche rischioso perché nasconde il fatto che possono succedere errore di InvalidCast a run-time
Non conosco ancora quale vantaggo da ne se ripaga lo svantaggio
Il comportamento che mi aspetto è che questo foreach accetti come tipo del elemento IPersistent o una sua classe base altrimenti dia errore a compile-time
Questo è pane per i denti di Adrian ;-)