正如语言规范所述(第 7.5.12 节),我习惯于 C# 不执行溢出检查:
对于未被任何已检查或未检查的运算符或语句包围的非常量表达式(在运行时计算的表达式),默认溢出检查上下文是未检查的,除非外部因素(例如编译器切换和执行环境配置)需要检查评估。
在低级代码中进行数组边界检查时,我利用了这一点:
if ((uint)index >= (uint)TotalCount)
...
如果 index 为负数,我希望它变成一个很大的正数,从而超过 TotalCount。然而,令我惊讶的是,负数会产生 OverflowException,我必须将表达式包装在 unchecked() 中。我查看了 Visual Studio 中的项目选项,但没有看到启用或禁用溢出检查的选项。那么为什么它会在这里呢?