可能重复:
为什么默认情况下语言不会在整数溢出时引发错误?
为什么 C# 默认不使用算术溢出检查?
我认为在发生这种情况时发生异常通常会更好,这样错误就不会被掩盖。我知道利用发生的“包装”行为有时会很有用,但是unchecked
在这些情况下可以使用关键字来明确意图。
我希望这个决定是有意做出的,也许是为了增加与其他基于 C 语言的兼容性。
可能重复:
为什么默认情况下语言不会在整数溢出时引发错误?
为什么 C# 默认不使用算术溢出检查?
我认为在发生这种情况时发生异常通常会更好,这样错误就不会被掩盖。我知道利用发生的“包装”行为有时会很有用,但是unchecked
在这些情况下可以使用关键字来明确意图。
我希望这个决定是有意做出的,也许是为了增加与其他基于 C 语言的兼容性。
C# 语言规范是这样说的:
对于未被任何
checked
orunchecked
运算符或语句包围的非常量表达式(在运行时计算的表达式),默认的溢出检查上下文是unchecked
除非外部因素(例如编译器切换和执行环境配置)要求进行计算checked
。
这种选择的原因可能是性能。我同意这个决定会导致那些不知道“静默”整数溢出的人出错。
如果您的 C# 文件属于 C# 项目文件 ( *.csproj
),则该文件包含“默认”溢出检查上下文的配置。要更改它,请参阅本页的在 Visual Studio 开发环境中设置此编译器选项。
如果您不使用.csproj
文件,则可能是从命令行编译所有内容,然后上面的页面会告诉您使用哪个命令行选项来设置默认的溢出检查上下文。
在这里查看我对类似问题的回答:Best way to handle Integer overflow in C#?
... 有一个 C# 编译器选项定义了如何处理已检查和未检查之外的表达式:/checked。
默认行为适用于大多数应用程序。对于其他应用程序,严格检查应该是默认设置,有一个编译器选项可以启用这种行为。