Я думаю, что это похоже на ошибку в компиляторе C#.Почему компилятор оценивает остаток MinValue% -1, отличный от времени выполнения?
Рассмотрим этот код (внутри метода):
const long dividend = long.MinValue;
const long divisor = -1L;
Console.WriteLine(dividend % divisor);
Он компилирует без ошибок (или предупреждений). Похоже на ошибку. При запуске печатает 0
на консоли.
Тогда без const
, код:
long dividend = long.MinValue;
long divisor = -1L;
Console.WriteLine(dividend % divisor);
Когда это выполняется, он правильно приводит к OverflowException
броска.
Спецификация языка C# упоминает этот случай конкретно и говорит, что должен быть выброшен System.OverflowException
. Это не зависит от контекста checked
или unchecked
(похоже, ошибка с постоянными операндами времени компиляции оператору останова совпадает с checked
и unchecked
).
же ошибка происходит с int
(System.Int32
), а не только long
(System.Int64
).
Для сравнения, компилятор обрабатывает dividend/divisor
с const
операндами намного лучше, чем dividend % divisor
.
Мои вопросы:
Правильно ли я это ошибка? Если да, это известная ошибка, которую они не хотят исправлять (из-за обратной совместимости, даже если глупо использовать % -1
с постоянной времени компиляции -1
)? Или мы должны сообщить об этом, чтобы они могли исправить его в следующих версиях компилятора C#?
Упоминание @EricLippert могло бы привлечь нужную толпу для этого вопроса :) –
@Morten, в этот момент он мог просто смотреть на него с окуня в Coverity. ;) –
Я думаю, вы должны пожертвовать этим, потому что это раздражает меня, почему это происходит. Спецификации говорят, что любое постоянное выражение, которое может вызывать исключение во время выполнения, должно вызывать ошибку компиляции во время компиляции !! –