Nel codice qui sotto:Domanda su C# covarianza
interface I1 { }
class CI1: I1 { }
List<CI1> listOfCI1 = new List<CI1>();
IEnumerable<I1> enumerableOfI1 = listOfCI1; //this works
IList<I1> listofI1 = listOfCI1; //this does not
sono in grado di assegnare la mia "listOfCI1" per un IEnumerable<I1>
(a causa di covarianza)
Ma perché non sono io in grado di assegnare a un IList<I1>
? Del resto, non si può nemmeno effettuare le seguenti operazioni:
List<I1> listOfI12 = listOfCI1;
Non dovrebbe covarianza mi permetterà di assegnare un tipo di derivato ad un tipo di base?
A proposito, quel discorso è stato grandioso. –
@Arnis: Grazie - mi sono divertito anch'io, anche se non sono riuscito a mostrare il video Hokey Cokey che avevo registrato ... –
Jon, così ha aggiunto il team BCL (IEnumerable: IEnumerable), perché IEnumerable non ti consente di aggiungere nuovi membri (cioè il suo immutabile) rendendolo sicuro. Ma d'altra parte non ha aggiunto "out" su IList perché è mutabile (rendendo possibile aggiungere un'implementazione diversa all'elenco sottostante?) –