арифметическое исключение в C # - PullRequest
7 голосов
/ 16 июля 2010

Почему в C # Пример A действителен, компилируется и будет просто переноситься, а примеры 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;

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

Ответы [ 3 ]

17 голосов
/ 16 июля 2010

Ваши примеры 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;

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

3 голосов
/ 16 июля 2010

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

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

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

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

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

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

1 голос
/ 16 июля 2010

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

...