Я думаю, что это похоже на ошибку в компиляторе С#.
Рассмотрим этот код (внутри метода):
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)? Или мы должны сообщать об этом, чтобы они могли исправить его в следующих версиях компилятора С#?