【发布时间】:2011-01-10 02:41:52
【问题描述】:
.NET 4/Silverlight 4 中的IDictionary<TKey, TValue> 不支持协方差,即我不能这样做
IDictionary<string, object> myDict = new Dictionary<string, string>();
类似于我现在可以用IEnumerable<T>s 做什么。
可能归结为KeyValuePair<TKey, TValue> 也不是协变的。我觉得至少在字典中应该允许协方差的值。
那是错误还是功能?它会出现吗,也许在 .NET 37.4 中?
更新(2 年后):
.NET 4.5 中会有一个IReadOnlyDictionary<TKey, TValue>,但它也不是协变的:·/,因为它派生自IEnumerable<KeyValuePair<TKey, TValue>>,而KeyValuePair<TKey, TValue> 不是接口,因此不能是协变的。
BCL 团队必须重新设计很多东西才能提出并改用ICovariantPair<TKey, TValue>。对于协变接口,强类型索引器 á la this[TKey key] 也是不可能的。类似的结果只能通过在某处放置扩展方法 GetValue<>(this IReadOnlyDictionary<TKey, TValue> self, TKey key) 来实现,该方法在内部必须以某种方式调用实际的实现,可以说这看起来是一种相当混乱的方法。
【问题讨论】:
-
感谢您提供有关 .NET 4.5 的更新。恕我直言,在只读字典上使用协方差会很有用,所以它看起来不被支持太糟糕了。
-
可以在here 找到支持向上转换的
IReadOnlyDictionary包装器。它可以包装字符串字典并将其公开为对象字典。
标签: .net dictionary .net-4.0 covariance