LINQ-Sum的不同行为和手动添加整数值

时间:2014-04-16 14:49:16

标签: c# linq int

这可能是造成这种不同行为的原因:

int temp = 2147483647;
Console.WriteLine(temp + 1); //returns -2147483648 

List<int> ltemp = new List<int>() { 2147483647, 1 };
Console.WriteLine(ltemp.Sum()); //returns OverFlowException

1 个答案:

答案 0 :(得分:6)

Enumerable.Sum是通过使用checked关键字计算总和来实现的。

checked (C# Reference)

  

checked关键字用于显式启用溢出检查   积分型算术运算和转换。

它使用以下代码 - Source Reference - Microsoft

public static int Sum(this IEnumerable<int> source) {
    if (source == null) throw Error.ArgumentNull("source");
    int sum = 0;
    checked {
        foreach (int v in source) sum += v;
    }
    return sum;
}

如果你这样做:

checked
{
    int temp = 2147483647;
    Console.WriteLine(temp + 1); //returns -2147483648
}

您将获得相同的异常