Possible Duplicate:
Why don’t languages raise errors on integer overflow by default?
Why doesn't C# use arithmetic overflow checking by default?
I figure that it would generally be better to have exceptions occur when this occurs so that errors aren't obscured. I know that it's occasionally useful to take advantage of the 'wrapping' behaviour that occurs, but the unchecked keyword could be used in these circumstances to make the intentions explicit.
I expect that this decision was made intentionally, perhaps to increase compatibility with other C-based languages.
-
5Probably for performance reasons - overflow checking is slow, and not needed in the vast majority of cases.Richard Deeming– Richard Deeming2012年11月06日 21:08:33 +00:00Commented Nov 6, 2012 at 21:08
-
@MichaelPetito, thanks; that question seems better than this one, and it has good answers, so I think this should be closed.Sam– Sam2012年11月06日 21:53:53 +00:00Commented Nov 6, 2012 at 21:53
2 Answers 2
The C# Language Specification says this:
For non-constant expressions (expressions that are evaluated at run-time) that are not enclosed by any
checkedoruncheckedoperators or statements, the default overflow checking context isuncheckedunless external factors (such as compiler switches and execution environment configuration) call forcheckedevaluation.
The reason for this choice is probably performance. I agree that this decision leads to errors among those who are not aware of "silent" integer overflow.
If your C# files belong to a C# project file (*.csproj), then that file holds configuration of the "default" overflow checking context. To changed it, see To set this compiler option in the Visual Studio development environment in this page.
If you don't use .csproj files, you're probably compiling everything from the command line, and then the above page tells you what command line option to use to set the default overflow checking context.
Comments
See my answer to similar question here: Best way to handle Integer overflow in C#?
... there is a C# compiler option that defines how expressions outside of checked and unchecked are handled: /checked.
The default behavior is suitable for most applications. For other applications, where strict checking should be the default, there is a compiler option to enable such behavior.