Нет ошибки переполнения во время компиляции, когда int.MaxValue назначается переменной - PullRequest
2 голосов
/ 02 апреля 2020

В C# я понимаю, что следующий код завершится ошибкой из-за переполнения целых чисел:

int max = int.MaxValue + 1; // error CS0220: The operation overflows at compile time in checked mode

Но тогда почему следующий код C# не дает сбой во время компиляции и просто деформируется ?

int max = int.MaxValue;
int res = max + 1; // -2147483648

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Компилятор не выполняет углубленный анализ, чтобы обнаружить возможные последствия, когда целочисленная переменная может переполниться. Первый пример довольно очевиден - второй должен проанализировать две разные строки кода, чтобы обнаружить переполнение, которое компилятор не предназначен для этого.

Из документации для ключевого слова checked (выделение добавлено):

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

0 голосов
/ 02 апреля 2020

Необходимо явно включить проверку переполнения с помощью ключевого слова checked .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...