为什么我在这里得到编译器错误:
int a = 2147483647 + 10;
而不是在这里,如果我正在执行相同的操作:
int ten = 10; int b = 2147483647 + ten;
我正在学习使用checked和MSDN网站不清楚为什么在第一个代码片段中引发了OverflowException:
默认情况下,如果表达式生成的值超出目标类型的范围,则仅包含常量值的表达式会导致编译器错误.如果表达式包含一个或多个非常量值,则编译器不会检测溢出.
它只解释了行为,但没有解释这种行为的原因.我想知道引擎盖下发生了什么.
原因是当你有int a = 2147483647 + 10;
编译器可以预测statement(a
)的结果时它会知道它会导致溢出,因为2147483647和10都是常量,它们的值在编译时是已知的.
但是当你有
int ten = 10; int b = 2147483647 + ten;
一些其他线程(或其他东西,可能是一个向导,可能是内存中的危险...)可能会ten
在执行int b = 2147483647 + ten;
语句之前更改值,并且无法在编译时预测溢出.