有一个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()来检查下溢/溢出?
答案 0 :(得分:15)
如果发生溢出,所有Enumerable.Sum()
重载的规范将抛出OverflowException
。这是不可配置的,这是设计的。只是不要使用那种方法。
你仍然可以在这里使用LINQ并使用Enumerable.Aggregate()
方法而不进行检查:
public static int Puzzle(int[] a)
{
return a.Aggregate((sum, i) => unchecked(sum + i));
}
否则手工完成。