我这辈子都想不通。假设我有以下两个字典对象:
// Assume "query" is a LINQ queryable.
Dictionary<string, int> d1 = query.ToDictionary(k => k.Key, v => v.Value);
Dictionary<string, int> d1 = query.ToDictionary(k => k.Key, v => v.Value);
以下语句会产生一个编译时错误,即无法在 Dictionary 和 IDictionary 之间进行隐式转换:
// Compile time error!
Tuple<IDictionary<string, int>, IDictionary<string, int>> = Tuple.Create(d1, d2);
我必须明确地进行转换:
Tuple<IDictionary<string, int>, IDictionary<string, int>> = Tuple.Create(d1 as IDictionary<string, int>, d2 as IDictionary<string, int>);
我不明白为什么编译器无法弄清楚协方差操作 - Dictionary 实现 IDictionary - 特别是因为我们都知道这样的事情当然会起作用:
IDictionary<string, int> d3 = d1;
我确信这种行为是有充分理由的,我很好奇它是什么。
更新1: 为了澄清,我对行为而不是如何解决问题感到好奇。我知道不同的解决方案:)
更新 2:
谢谢大家的精彩回答。我不知道Tuple
是不变的,现在我知道了。