арифметическое исключение в C#

Почему в C# Пример допустимое, компилируемое и просто перенесется, в то время как примеры B не скомпилируют?

A

int val = 0;
val = val + Int32.MaxValue +2;

или

int val = Int32.MaxValue;
val++;

B

int val = 0;
val = 2147483647 + 1;

или

int val = 0;
int val = Int32.MaxValue + 1;

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

7
задан Chris G 16 July 2010 в 20:25
поделиться

3 ответа

Ваши B-примеры свернуты константой во время компиляции, указывая компилятору, что это гарантировано переполнение.

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

Например ...

int val = 0;
// some other thread changes `val` to -5...
val = val + Int32.MaxValue +2; // no overflow

Однако, если вы знаете , что val не изменится, и присвойте 0 const int :

const int startval = 0;
int val = startval + Int32.MaxValue + 2;

Вы можете получить проверку переполнения во время компиляции, потому что значение может быть полностью определено и, следовательно, свернуто с константой.

17
ответ дан 6 December 2019 в 08:41
поделиться

Я знаю, что арифметические исключения не проверяются по умолчанию, если только вы явно не сделаете это с помощью проверенного метода, блока или атрибута в конфигурации

. Вы не знаете , потому что это утверждение неверно . И на самом деле вы знаете, что это неверно, потому что вы предоставили случай, когда ваше утверждение оказывается ложным!

Я отсылаю вас к разделу 7.6.12 спецификации C #, часть которой я воспроизвожу здесь для вашего удобства:

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

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

Подробнее см. В спецификации.

3
ответ дан 6 December 2019 в 08:41
поделиться

Это просто связано с ограничениями проверки времени компиляции. Некоторые вещи можно узнать только во время выполнения.

1
ответ дан 6 December 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: