Почему я получаю следующее предупреждение для этого тривиального примера кода, как только уровень предупреждения находится на уровне 2 или выше?
public int Foo(int a)
{
if (a >= 0) throw new ArgumentException("a should be negative", "a");
Contract.EndContractBlock();
return a;
}
CodeContracts: Предлагаемые требования: Это предварительное условие является избыточным: рассмотрите возможность его удаления. Вы сравниваете значение структуры с нулевым?
Ясно, что целое число может быть отрицательным, поэтому предусловие вряд ли излишне, так почему же я получаю это предупреждение?
Изменить: вот что показывает ILSpy для созданной функции при просмотре исполняемого файла:
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;
}
b
в функции? - person lakshayg   schedule 18.06.20150 <= a
?clt
обычно используется дляas
иis
в режиме выпуска. Можете ли вы проверить, отличается ли он и для выпуска/отладки? - person leppie   schedule 18.06.2015ldarg.1; ldc.i4.0; clt
для первой версии (перевернутый и cgt для второй), так что ничего необычного я бы не сказал. - person Voo   schedule 18.06.2015Contract.Assert
, так что, вероятно, это как-то связано с этим. - person Voo   schedule 18.06.2015Contract.Requires(a < 0);
не выдает предупреждения. - person Matthew Watson   schedule 18.06.2015