gpt4 book ai didi

c# - 无法在方法调用中将字典转换为 IDictionary

转载 作者:太空狗 更新时间:2023-10-29 22:16:34 24 4
gpt4 key购买 nike

我这辈子都弄不明白。假设我有以下两个字典对象:

// 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>);

我不明白为什么编译器无法弄清楚协方差操作 - Dictionary 实现 IDictionary - 特别是因为众所周知,像这样的东西当然会起作用:

IDictionary<string, int> d3 = d1;

我确信这种行为有充分的理由,我很好奇它是什么。

更新 1:只是为了澄清一下,我对这种行为感到好奇,而不是如何解决问题。我知道不同的解决方案:)

更新 2:谢谢大家的精彩回答。我不知道 Tuple 是不变的,但现在我知道了。

最佳答案

基本上,问题是 Tuple family 在其类型参数上不是协变的。不可能,因为这是一个类。但是,可以创建协变的接口(interface)或委托(delegate)版本,因为没有成员在输入位置接受类型参数。

这是最简单的 Tuple<T1> :

Tuple<string> stringTuple = Tuple.Create("Foo");
Tuple<object> objectTuple = stringTuple;

这个调用:

Tuple.Create(d1, d2);

... 将两种类型参数都推断为 Dictionary<string, int> ,因此您正尝试从 Tuple<Dictionary<string, int>, Dictionary<string, int>> 进行转换到 Tuple<IDictionary<string, int>, IDictionary<string, int>> ,这是行不通的。

as的版本更改参数类型,以便类型推断给出所需的类型参数——但根据塞巴斯蒂安的回答,直接编写类型参数并完全避免推断会更简单:

Tuple.Create<IDictionary<string, int>, IDictionary<string, int>>(d1, d2)

如果您使用 var在这一点上,还不错:

var x = Tuple.Create<IDictionary<string, int>, IDictionary<string, int>>(d1, d2);

x 的类型现在将是 Tuple<IDictionary<string, int>, IDictionary<string, int>>这就是你想要的。

编辑:如评论中所述,此时您不妨只使用构造函数:

var x = new Tuple<IDictionary<string, int>, IDictionary<string, int>>(d1, d2);

关于c# - 无法在方法调用中将字典转换为 IDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com