我很难理解这个。假设我有以下两个字典对象:
// 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);
以下语句产生编译时错误,即无法进行字典和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>);
我不理解为什么编译器无法推断出协变操作 - 字典实现了IDictionary - 特别是因为像这样的代码当然可以正常工作,我们都知道:
IDictionary<string, int> d3 = d1;
我相信这种行为有充分的理由,我很好奇它是什么。
更新1: 只是想澄清一下,我好奇的是这种行为,而不是如何解决问题。我已经了解了不同的解决方案 :)
更新2: 感谢大家提供的精彩答案。我不知道元组是逆变的,现在我知道了。
T1
和T2
给静态的Tuple.Create<T1, T2>
方法时(就像这里一样),你也可以使用泛型类型Tuple<T1, T2>
的普通实例构造函数和新对象表达式:new Tuple<Something, SomethingElse>(d1, d2)
。 - Jeppe Stig Nielsen