.NET core 6 在使用 lambda 时抛出算术溢出异常

.NET core 6 throws arithmetic overflow exception when using lambda

为什么只有 miniMaxSum 函数的 lambda 版本会抛出算术溢出异常?

使用 Lambda 编写代码:

void miniMaxSum(List<int> arr)
{
    Int64 maxNum = 0;
    Int64 minNum = 0;
    Int64 min = 0;
    Int64 max = 0;
    maxNum = arr.Max();
    minNum = arr.Min();
    min = arr.Where(n => n != maxNum).Sum();
    max = arr.Where(n => n != minNum).Sum();
        
    Console.WriteLine($"{min} {max}");
}

List<int> nums = new List<int>{
    256741038, 
    623958417, 
    467905213, 
    714532089, 
    938071625
};

miniMaxSum(nums);

输出:

Unhandled exception. System.OverflowException: Arithmetic operation resulted in an overflow.
at System.Linq.Enumerable.Sum(IEnumerable1 source) at Program.<<Main>$>g__miniMaxSum|0_0(List1 arr) in /home/gabriel/source/HackerRank/MinMaxSum/Program.cs:line 10

没有 Lambda 的代码:

void miniMaxSum(List<int> arr)
{
    Int64 maxNum = 0;
    Int64 minNum = 0;
    Int64 min = 0;
    Int64 max = 0;
    maxNum = arr.Max();
    minNum = arr.Min();
    Int64 aux = 0;
    for (int i =0;i <arr.Count;i++)
    {
        if (arr[i] != maxNum)
        {
            aux = checked((Int64)(min=min+arr[i]));
            min = aux;
        }
            
        if (arr[i] != minNum)
        {
            aux = checked((Int64)(max=max+arr[i]));
            max = aux;
        }
    }
         
    Console.WriteLine($"{min} {max}");
}

List<int> nums = new List<int>{
    256741038, 
    623958417, 
    467905213, 
    714532089, 
    938071625
};

miniMaxSum(nums);

输出:

2063136757 2744467344

谁能解释一下这种行为?

Linq Sum 方法 returns 与您应用它的类型相同,在本例中为 int,只是因为您将其分配给 long/Int64 不会改变它,因此它会溢出。解决这个问题的一种方法是将列表项转换为 long,您可以使用 Select:

min = arr
    .Where(n => n != maxNum)
    .Select(x => (long)x)
    .Sum();

max = arr
    .Where(n => n != minNum)
    .Select(x => (long)x)
    .Sum();