C#中Dictionary使用ulong类型调用Sum方法报错问题
为什么LINQ的Sum方法处理ulong类型会报错?
问题原因
.NET LINQ的Sum方法并没有提供直接支持ulong(无符号64位整数)的重载。内置的Sum重载仅覆盖了有符号整数(int、long)、浮点数(float、double)和decimal类型。当你使用int类型时,代码刚好匹配Sum<int>的重载,所以能正常编译运行;但换成ulong后,找不到对应的重载,编译器就会抛出语法错误。
即使你尝试显式指定泛型参数(比如Sum<ulong>),也会因为不存在接受返回ulong的选择器的Sum重载而报错。
解决方案
1. 手动循环累加
最直接的方式是用foreach循环手动累加:
public record DemoRecord(string Name, ulong Size); public class DemoStackOverflow { public ulong GetSum(Dictionary<string, DemoRecord> data) { ulong total = 0; foreach (var entry in data) { total += entry.Value.Size; } return total; } }
2. 使用LINQ的Aggregate方法
如果想保留LINQ风格,可以用Aggregate自定义累加逻辑,指定ulong类型的初始值:
public ulong GetSum(Dictionary<string, DemoRecord> data) { return data.Aggregate(0UL, (sum, entry) => sum + entry.Value.Size); }
这里0UL是ulong类型的0,确保累加过程中类型匹配。
3. 自定义Sum扩展方法
如果需要频繁处理ulong的求和,可以封装一个扩展方法,让代码和原来的写法保持一致:
public static class LinqExtensions { public static ulong Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, ulong> selector) { ulong sum = 0; foreach (var item in source) { sum += selector(item); } return sum; } } // 调用方式和原来的错误代码完全一致 public ulong GetSum(Dictionary<string, DemoRecord> data) { return data.Sum(x => x.Value.Size); }
内容的提问来源于stack exchange,提问作者Wouter Vandenputte
相关产品推荐
相关产品推荐

