使用常量进行算术运算时出现溢出错误

Bra*_*iat 12 c#

我尝试了以下代码:

int x, y;
x = y = int.MaxValue;

int result = x + y;
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,结果将包含-2(我知道为什么).

但是当这样做时:

const int x = int.MaxValue;
const int y = int.MaxValue;

int result = x + y;
Run Code Online (Sandbox Code Playgroud)

由于溢出问题,这不会编译.为什么?

Jon*_*eet 13

因为这两个xy的编译时间常数,所以是x + y.编译器知道结果会溢出,所以它会抱怨它.

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

int result = unchecked(x + y);
Run Code Online (Sandbox Code Playgroud)

从C#5规范的7.6.12节 - 列出+-,/*:

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

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

对于未由任何checkedunchecked运算符或语句包含的非常量表达式(在运行时计算的表达式),unchecked除非外部因素(例如编译器开关和执行环境配置)调用已检查的评估,否则缺省溢出检查上下文.

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