Подтвердить что ты не робот

Ложное положительное: предварительное условие избыточно

Почему я получаю следующее предупреждение для этого тривиального образца кода, как только уровень предупреждения находится на 2-м уровне или выше?

public int Foo(int a)
{
    if (a >= 0) throw new ArgumentException("a should be negative", "a");
    Contract.EndContractBlock();
    return a;
}

CodeContracts: Предлагаемый требует: Это предварительное условие избыточно: Подумайте об этом. Вы сравниваете значение struct с null?

Ясно, что целое число может быть отрицательным, поэтому предварительное условие вряд ли избыточно, поэтому почему я получаю это предупреждение?

Изменить: вот что показывает ILSpy для созданной функции при просмотре exe:

public int Foo(int a)
{
    if (a >= 0)
    {
        ContractHelper.RaiseContractFailedEvent(ContractFailureKind.Precondition, null, "a < 0", null);
        throw new ArgumentException("a should be negative", "a");
    }
    return a;
}

Code Contracts settings

4b9b3361

Ответ 1

Я знаю, что это прямо не отвечает на ваш вопрос, но, похоже, вы используете устаревший режим для кодовых контрактов.

В этом документе описывается рекомендуемый режим сборки на основе требований к использованию:

http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf

Из стр. 20, 21...

assembly mode usage guidelines

Другой фрагмент документа:

5.1.1 Режим сборки

Инструменты контрактов должны знать, какой режим использования вы выберете. Если вы используете VisualStudio, выберите режим Assemby на панели свойств контракта следующим образом:

  • Использование 1 или 2: стандартный контракт требует
  • Использование 3: Пользовательская проверка параметров

Это позволяет инструментам испускать правильные предупреждения, когда вы нарушаете правила использования. Если вы используете инструменты из командной строки передать правильный аргумент для опции -assemblyMode

Таким образом, используя режим сборки "Стандартный контракт требуется", вы можете выполнить одно из следующих действий:

Contract.Requires<ArgumentException>(a < 0, "a");
// OR
Contract.Requires(a < 0, "a should be negative");

Ни один из них не генерирует никаких предупреждений для меня.

Надеюсь, это все равно поможет.

Приветствия peteski