我尝试了以下代码:
int x, y;
x = y = int.MaxValue;
int result = x + y;
此代码工作正常,结果将包含-2(我知道原因)。
但这样做的时候:
const int x = int.MaxValue;
const int y = int.MaxValue;
int result = x + y;
由于溢出问题,这不会编译。为什么?
答案 0 :(得分:13)
因为x
和y
都是编译时常量,所以x + y
也是。{1}}。编译器知道结果会溢出,所以它会抱怨它。
您可以使用unchecked
表达式修复此问题:
int result = unchecked(x + y);
来自C#5规范的第7.6.12节 - 列出+
,-
,/
和*
之后:
当上述操作之一产生的结果太大而无法在目标类型中表示时,执行操作的上下文控制结果行为:
- 在
checked
上下文中,如果操作是常量表达式(第7.19节),则会发生编译时错误。- 在
unchecked
上下文中,通过丢弃任何不适合目标类型的高位来截断结果。对于未由任何
checked
或unchecked
运算符或语句包含的非常量表达式(在运行时计算的表达式),默认溢出检查上下文为unchecked
除非外部因素(例如编译器开关和执行环境配置)要求进行检查评估。对于常量表达式(可在编译时完全求值的表达式),默认溢出检查上下文始终为
checked
。除非在unchecked
上下文中明确放置常量表达式,否则在表达式的编译时评估期间发生的溢出总是会导致编译时错误。