这不应该导致溢出? 它不!
这是怎么回事? 我做一个简单的乘法:
Int64 x = 11111111111; Int64 y = 11111111111; Int64 z = x * y;
在乘法结束时,z显示的值为:
-5670418394979206991
这显然已经溢出了,但没有例外。 我想要一个被提出,但是…
请注意,这是在Windows Phone 7上,但我不认为这对问题有任何影响。 还是呢?
您可以使用已经被其他答案指出的已经检查过的块:
checked { long x = 11111111111; long y = 11111111111; long z = checked(x * y); // ... }
这导致了一个例外:
OverflowException:算术运算导致溢出。
如果您只是在需要检查的地方执行单个操作,则可以使用检查的expression式代替:
long x = 11111111111; long y = 11111111111; long z = checked(x * y);
您也可以设置/ checked编译器选项来使默认值被检查。
在Visual Studio开发环境中设置这个编译器选项:
- 打开项目的“ 属性页”对话框。 有关详细信息,请参阅设置Visual C#项目属性 。
- 单击configuration属性文件夹。
- 点击Build属性页面。
- 修改检查算术溢出/下溢属性 。
如果将默认值更改为已检查,则可以使用未经检查的块或expression式再次获取未经检查的行为。
检查它 :
checked { Int64 x = 11111111111; Int64 y = 11111111111; Int64 z = x * y; }
尝试:
checked { Int64 x = 11111111111; Int64 y = 11111111111; Int64 z = x * y; }
编译器假定您想这样做并继续溢出。 如果溢出需要被认为是操作的exception,则围绕checked
的操作checked
包装,并在运行时引发exception。
checked { Int64 x = 11111111111; Int64 y = 11111111111; Int64 z = x * y; }
System.OverflowException:抛出了System.OverflowExceptiontypes的exception。