System.Linq.ILookUpの定義は次のようになります
interface ILookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, IEnumerable {
int Count {
get;
}
IEnumerable<TElement> this[TKey key] {
get;
}
bool Contains(TKey key);
}
IEnumerableはIGrouping<TKey、TElement>で共変であり、IGrouping <TKey、TElement>はTElementで共変であり、インターフェイスはTElementのみをリターンタイプとして公開するため、ILookupもTElementで共変であると想定します。確かに、定義
interface IMyLookup<TKey, out TElement> : IEnumerable<IGrouping<TKey, TElement>>, IEnumerable {
int Count {
get;
}
IEnumerable<TElement> this[TKey key] {
get;
}
bool Contains(TKey key);
}
問題なくコンパイルできます。
では、元の定義にoutキーワードがない理由は何でしょうか。Linqの将来のバージョンが追加される可能性がありますか?