溢出exception正在抛出 – 即使该值超出限制

为什么以下代码将输出设为-2而不是抛出overflow exception

  long x = long.MaxValue; long y = long.MaxValue + x; 

实际行为取决于项目设置, unchecked等。要确保溢出exception使用已checked ,例如

  checked { long x = long.MaxValue; long y = long.MaxValue + x; } 

大概是因为你在未经检查的环境中执行它。 原始整数类型的算术可以在已检查或未检查的上下文中执行。 溢出的操作在已检查的上下文中抛出exception,并在未经检查的上下文中使用底部的N位(取决于类型)。 默认值取决于项目设置,但未选中“默认默认值”。

您可以在选中的上下文中显式执行操作,也可以更改项目设置。

明确地做(仅用于算术):

 long x = long.MaxValue; long y = checked(long.MaxValue + x); 

请注意,在编译时检查常量表达式,溢出将导致编译时错误,除非明确取消选中(无论项目设置如何)。 例如:

 long x = long.MaxValue + 1; // Error long y = unchecked(long.MaxValue + 1); // Equivalent to y = long.MinValue