跟踪 MSDN 文档,泛型中的协变和逆变 http://msdn.microsoft.com/en-us/library/dd799517%28v=vs.100%29.aspx.NET Framework 4 中已引入 在此之前,有IEnumerable<T>
从 .NET Framework 2.0 到 .NET Framework 3.5。然后在.NET Framework 4.0中我们可以看到IEnumerable<out T>
带类型参数T
作为协方差。
IGrouping<TKey, TElement>
and ILookup<TKey, TElement>
自 .NET Framework 3.5 以来就已存在。在 .NET Framework 4.0 中,前者已更新为IGrouping<out TKey, out TElement>
但后者已被省略,但未说明原因。
TKey
不能是协变的,因为Contains(TKey)
and this[TKey]
防止这种情况发生。
关于TElement
这个问题还不清楚。我不相信设计师只是错过了它。也许原因在于对未来的计划。或者他们想阻止类似下面的事情,但我不知道为什么:
string[] strings = new[] {"a", "a", "b", "b", "b", "c"};
ILookup<string, string> lookup = strings.ToLookup(s => s); // Valid.
ILookup<string, object> lookup = strings.ToLookup(s => s); // Now invalid, but would correct if TElement was covariant (out TElement).
还有其他作者也关注这个问题:
ToLookup http://edulinq.googlecode.com/hg/posts/18-ToLookup.html:
需要注意的一个稍微奇怪的一点是,虽然 IGrouping 在 TKey 和 TElement 中是协变的,但 ILookup 在其两个类型参数中都是不变的。虽然 TKey 必须是不变的,但 TElement 是协变的也是合理的