Lo System.Linq.ILookUp definizione recitaNon dovrebbe ILookup <TKey, TElement> essere (dichiarato) covariante in TElement?
interface ILookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, IEnumerable {
int Count {
get;
}
IEnumerable<TElement> this[TKey key] {
get;
}
bool Contains(TKey key);
}
Poiché IEnumerable è covariante in IGrouping < TKey, TElement >, IGrouping < TKey, TElement > è covariante TElement e l'interfaccia espone solo TElement come un tipo di ritorno, Suppongo che ILookup sia anche covariante in TElement. Infatti, la definizione
interface IMyLookup<TKey, out TElement> : IEnumerable<IGrouping<TKey, TElement>>, IEnumerable {
int Count {
get;
}
IEnumerable<TElement> this[TKey key] {
get;
}
bool Contains(TKey key);
}
compila senza problemi.
Quindi, quale potrebbe essere il motivo per cui la parola chiave out manca nella definizione originale? Potrebbe essere aggiunto le versioni future di Linq?
... nessuno ha pensato, progettato, implementato, testato, rilasciato .... o forse una ragione completamente diversa. –
Beh, mi stavo chiedendo se è già tutta la storia. D'altra parte, sono curioso di sapere se tali casi sono a) b) probabile che sia _fixed_ in futuro – bigge
LINQ è stato introdotto in .NET Framework 3.5 (C# 3.0), mentre la varianza per i parametri di tipo generico nelle interfacce da C# 4.0 . Potrebbe essere questa la ragione? –