Отключить проверку переполнения с помощью Array.Sum - PullRequest
5 голосов
/ 04 января 2012

Существует проблема 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 (), проверяет наличие переполнения.

Я не могу использовать ключевое слово unchecked вокруг вызова метода a.Sum (), поскольку сложение происходит внутриmethod.

Есть ли способ отключить проверку недостаточного / переполнения с помощью Array.Sum ()?

1 Ответ

15 голосов
/ 04 января 2012

Спецификация для всех перегрузок Enumerable.Sum() выдает OverflowException в случае переполнения. Это не настраивается, это по замыслу. Только не используйте этот метод.

Вы все еще можете использовать LINQ здесь и использовать метод Enumerable.Aggregate() вместо того, чтобы не выполнять проверку:

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

В противном случае сделайте это вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...