为什么C#默认不使用算术溢出检查?

可能重复:
为什么语言默认情况下不会在整数溢出上引发错误?

为什么C#默认不使用算术溢出检查?

我认为发生exception通常会更好,这样就不会模糊错误。 我知道利用发生的“包装”行为偶尔会有用,但是在这些情况下可以使用unchecked关键字来明确意图。

我希望这个决定是故意做出的,也许是为了增加与其他基于C语言的兼容性。

C#语言规范说:

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

这种选择的原因可能是性能。 我同意这个决定导致那些不知道“无声”整数溢出的人之间的错误。

如果您的C#文件属于C#项目文件( *.csproj ),那么该文件将保存“默认”溢出检查上下文的配置。 要更改它,请参阅在此页面 的Visual Studio开发环境设置此编译器选项

如果您不使用.csproj文件,您可能正在从命令行编译所有内容,然后上面的页面会告诉您使用哪个命令行选项来设置默认溢出检查上下文。

在这里查看我对类似问题的回答: 在C#中处理Integer溢出的最佳方法是什么?

…有一个C#编译器选项,用于定义如何处理checked和unchecked之外的表达式:/ checked。

默认行为适用于大多数应用程序。 对于其他应用程序,其中严格检查应该是缺省值,有一个编译器选项来启用此类行为。