 
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 ;-)