C#初始化含Tuple的Dictionary报错:无法转换Tuple至IEqualityComparer
解决Dictionary初始化时的类型转换错误
嘿,这个问题我太熟悉啦!你遇到的Cannot convert from 'System.Tuple' to 'System.Collections.Generic.IEqualityComparer'错误,本质是Dictionary的集合初始化语法用错了。
错误原因分析
你写的代码:
public static readonly Dictionary<int, Tuple<int, double>> DIAMETER_METRIC_CHAMFER = new Dictionary<int, Tuple<int, double>>({80, new Tuple<int, double>(16, 37.0)} );
编译器会把括号里的{80, new Tuple<...>}当成两个独立的构造函数参数:第一个是int类型的80,第二个是Tuple对象。但Dictionary没有接受(int, IEqualityComparer<TKey>)的构造函数,所以它误以为你想传递一个自定义的相等比较器,自然就抛出了类型不匹配的错误。
正确的初始化写法
Dictionary的集合初始化器要求每个键值对都用单独的大括号包裹,外层大括号用来包含所有键值对元素。修正后的代码如下:
public static readonly Dictionary<int, Tuple<int, double>> DIAMETER_METRIC_CHAMFER = new Dictionary<int, Tuple<int, double>>() { { 80, new Tuple<int, double>(16, 37.0) } };
额外优化(C# 7.0+)
如果你的项目使用C# 7.0或更高版本,推荐用ValueTuple替代Tuple,写法更简洁直观:
public static readonly Dictionary<int, (int, double)> DIAMETER_METRIC_CHAMFER = new Dictionary<int, (int, double)>() { { 80, (16, 37.0) } };
简单总结下:对于键值对集合的初始化,一定要记住每个键值对都要用内层大括号包起来,别让编译器误解你的意图哦~
内容的提问来源于stack exchange,提问作者AwesomeGuy
相关产品推荐
相关产品推荐

