禁用使用Array.Sum检查溢出

时间:2012-01-04 07:18:37

标签: c# linq overflow

有一个Pex4Fun问题,要求用户编写查找数组总和的代码。

using System;
using System.Linq;

public class Program {
  public static int Puzzle(int[] a) {
    return a.Sum();
  }
}

Pex预计它可以通过{-1840512878,-2147418112}并返回下溢数字307036306,但LINQ方法Array.Sum()会检查溢出。

我不能在a.Sum()的方法调用周围使用unchecked关键字,因为添加发生在方法内部。

有没有办法禁止使用Array.Sum()来检查下溢/溢出?

1 个答案:

答案 0 :(得分:15)

如果发生溢出,所有Enumerable.Sum()重载的规范将抛出OverflowException。这是不可配置的,这是设计的。只是不要使用那种方法。

你仍然可以在这里使用LINQ并使用Enumerable.Aggregate()方法而不进行检查:

public static int Puzzle(int[] a)
{
    return a.Aggregate((sum, i) => unchecked(sum + i));
}

否则手工完成。