12

我尝试了以下代码:

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;

由于溢出问题,这将无法编译。为什么?

4

1 回答 1

13

因为xy都是编译时常量,所以x + y. 编译器知道结果会溢出,所以它会抱怨它。

您可以通过使用unchecked表达式来解决此问题:

int result = unchecked(x + y);

来自 C# 5 规范的第 7.6.12 节 - 在列出+-/之后*

当上述操作之一产生的结果太大而无法在目标类型中表示时,执行操作的上下文将控制结果行为:

  • checked上下文中,如果操作是常量表达式(第 7.19 节),则会发生编译时错误。
  • unchecked上下文中,通过丢弃任何不适合目标类型的高位位来截断结果。

对于未被任何checkedorunchecked运算符或语句包围的非常量表达式(在运行时计算的表达式),默认的溢出检查上下文是unchecked除非外部因素(例如编译器切换和执行环境配置)要求检查计算。

对于常量表达式(可以在编译时完全求值的表达式),默认的溢出检查上下文总是checked. 除非将常量表达式显式放置在unchecked上下文中,否则在表达式的编译时求值期间发生的溢出总是会导致编译时错误。

于 2013-11-01T20:42:13.707 回答