Ho una routine diC# passando una collezione di oggetti InterfaceImplementingClass ad una routine che prende una raccolta di interfaccia .NET oggetti
public void SomeRoutine(List<IFormattable> list) { ... }
Allora provo a chiamare questa routine
List<Guid>list = new List<Guid>();
list.Add(Guid.NewGuid());
SomeRoutine(list);
E viene a mancare con un errore in fase di compilazione. System.Guid implementa IFormattable, ma l'errore che ottengo è
non può convertire da 'System.Collections.Generic.List' a 'System.Collections.Generic.List'
NOTA : Otterrai lo stesso errore se utilizzi solo una serie di Guids. Generici NON è la causa ....
Ma! Dato questo
public void SomeRoutine2(IFormattable obj) { ... }
e questo
Guid a = Guid.NewGuid();
SomeRoutine2(a);
Compila! Quindi la domanda è PERCHÉ? Perché sono in grado di passare un oggetto Guid (che implementa IFormattable) in una routine che accetta un oggetto di IFormattable, ma quando provo ad estenderlo a una raccolta (un elenco generico, o un array o qualsiasi altra cosa), ottengo un errore di conversione?
Ho avuto un momento di trovare una risposta, e ho pensato che questo sarebbe il posto migliore dove andare.
Ti rendi conto che la risposta contrassegnata (covarianza .NET 4.0) non si applica effettivamente agli elenchi, dove-come generici funziona * ora *? –
Vedere anche: http://marcgravell.blogspot.com/2009/02/what-c-40-covariance-doesn-do.html –
Tranne che non ha funzionato con una serie di Guids con una routine che sta cercando una serie di IFormattable, sia ....? – emkayultra