这不应该导致溢出? 它不!

这是怎么回事? 我做一个简单的乘法:

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开发环境中设置这个编译器选项:

  1. 打开项目的“ 属性页”对话框。 有关详细信息,请参阅设置Visual C#项目属性 。
  2. 单击configuration属性文件夹。
  3. 点击Build属性页面。
  4. 修改检查算术溢出/下溢属性

如果将默认值更改为已检查,则可以使用未经检查的块或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。