Ваши примеры 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;
Вы можете получить свой чек переполнения во время компиляции, потому что значение может быть полностью определено и, следовательно, свернуто постоянным.