You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:12:19