我尝试了以下代码:
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;
由于溢出问题,这将无法编译。为什么?
因为x
和y
都是编译时常量,所以也是如此x + y
。编译器知道结果将溢出,因此抱怨它。
您可以使用unchecked
表达式来解决此问题:
int result = unchecked(x + y);
从C#5规范的第7.6.12 -上市后+
,-
,/
和*
:
当上述操作之一产生的结果太大而无法在目标类型中表示时,执行操作的上下文将控制所得的行为:
- 在
checked
上下文中,如果运算是一个常量表达式(第7.19节),则会发生编译时错误。- 在
unchecked
上下文中,结果将被舍弃,方法是丢弃任何不适合目标类型的高阶位。对于未被任何
checked
或unchecked
运算符或语句包围的非常量表达式(在运行时评估的表达式),默认的溢出检查上下文是unchecked
除非外部因素(例如编译器开关和执行环境配置)要求进行检查的评估。对于常量表达式(可以在编译时完全求值的表达式),默认的溢出检查上下文始终为
checked
。除非将常量表达式显式放置在unchecked
上下文中,否则在表达式的编译时求值过程中发生的溢出始终会导致编译时错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句