可能重复:
Why don’t languages raise errors on integer overflow by default?
为什么C#默认不使用算术溢出检查?
我认为发生异常通常会更好,这样就不会模糊错误。我知道利用发生的“包装”行为偶尔会有用,但在这些情况下可以使用unchecked
关键字来明确意图。
我希望这个决定是故意做出的,也许是为了增加与其他基于C语言的兼容性。
答案 0 :(得分:15)
C#语言规范说明了这一点:
对于非常量表达式(在 未被任何
checked
或unchecked
运算符包围的运行时 或语句,默认的溢出检查上下文是unchecked
除非外部因素(如编译器切换和执行 环境配置)要求checked
评估。
这种选择的原因可能是表现。我同意这个决定导致那些不知道“无声”整数溢出的人之间的错误。
如果您的C#文件属于C#项目文件(*.csproj
),那么该文件将保存“默认”溢出检查上下文的配置。要更改它,请参阅{{3>}中的在Visual Studio开发环境中设置此编译器选项。
如果您不使用.csproj
文件,您可能正在从命令行编译所有内容,然后上面的页面会告诉您使用哪个命令行选项来设置默认的溢出检查上下文。
答案 1 :(得分:2)
在此处查看我对类似问题的回答:Best way to handle Integer overflow in C#?
...有一个C#编译器选项,用于定义表达式之外的方式 处理已检查和未检查:/ checked。
默认行为适用于大多数应用程序。对于其他应用程序,其中严格检查应该是默认值,有一个编译器选项可以启用此类行为。