Я думаю, что это похоже на ошибку в компиляторе С#.
Рассмотрим этот код (внутри метода):
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
выбрасывается.
Спецификация языка С# упоминает этот случай специально и говорит, что должен быть выброшен System.OverflowException
. Он не зависит от контекста checked
или unchecked
(похоже, ошибка с константами постоянной времени компиляции оператору остатка совпадает с checked
и unchecked
).
Такая ошибка возникает с int
(System.Int32
), а не только long
(System.Int64
).
Для сравнения, компилятор обрабатывает dividend / divisor
с операндами const
намного лучше, чем dividend % divisor
.
Мои вопросы:
Я прав, это ошибка? Если да, это известная ошибка, которую они не хотят исправлять (из-за обратной совместимости, даже если глупо использовать % -1
с постоянной времени компиляции -1
)? Или мы должны сообщать об этом, чтобы они могли исправить его в следующих версиях компилятора С#?