Ошибка переполнения при выполнении арифметических операций с константами

Я попробовал следующий код:

int x, y;
x = y = int.MaxValue;

int result = x + y;

Этот код работает отлично, и результат будет содержать -2 (я знаю почему).

Но при этом:

const int x = int.MaxValue;
const int y = int.MaxValue;

int result = x + y;

Это не скомпилируется из-за проблемы с переполнением. Почему?

Ответ 1

Потому что x и y являются константами времени компиляции, поэтому x + y. Компилятор знает, что результат будет переполняться, поэтому он жалуется на это.

Вы можете исправить это, используя выражение unchecked:

int result = unchecked(x + y);

Из раздела 7.6.12 спецификации С# 5 - после перечисления +, -, / и *:

Когда одна из приведенных выше операций создает результат, который слишком велик для представления в типе адресата, контекст, в котором выполняется эта операция, управляет результатом:

  • В контексте checked, если операция является константным выражением (§7.19), возникает ошибка времени компиляции.
  • В контексте unchecked результат усекается путем отбрасывания любых старших битов, которые не соответствуют типу назначения.

Для не константных выражений (выражений, которые оцениваются во время выполнения), которые не заключены ни в какие операторы или операторы checked или unchecked, контекст проверки переполнения по умолчанию unchecked, если внешние факторы (такие как параметры компилятора и конфигурация среды выполнения). Вызовите проверяемую оценку.

Для постоянных выражений (выражений, которые могут быть полностью оценены во время компиляции), контекст проверки переполнения по умолчанию всегда checked. Если постоянное выражение явно не помещается в контексте unchecked, переполнения, возникающие во время оценки времени компиляции выражения, всегда вызывают ошибки времени компиляции.