【问题标题】:Different behaviour of LINQ-Sum and manual adding of integer valuesLINQ-Sum 的不同行为和手动添加整数值
【发布时间】:2014-05-31 12:41:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# linq int


    【解决方案1】:

    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
    }
    

    你会得到同样的异常

    【讨论】:

    • 当然,在 C# 中,非常量表达式默认为 unchecked。 +1
    • 嗯,默认值真的在 C# 之外,这取决于编译器。
    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2022-12-01
    相关资源
    最近更新 更多