你好,SO!我试图添加两个字节的变量,但注意到了奇怪的结果。
byte valueA = 255;
byte valueB = 1;
byte valueC = (byte)(valueA + valueB);
Console.WriteLine("{0} + {1} = {2}", valueA.ToString(),
valueB.ToString(),
valueC.ToString());
当我尝试运行程序时,它显示
255 + 1 = 0
上面的代码发生了什么?为什么编译器不抛出OverflowException
?我怎样才能捕捉到异常?我是一个VB爱好者,正在慢慢地迁移到C#:)很抱歉有这个问题。
C#代码默认为unchecked
,因此溢出将自动换行,而不是引发异常。
您可以通过将代码封装在checked
块中来获得异常,而代价是轻微的性能历史记录。
因为默认情况下,C#
不检查算术运算溢出。尝试用checked
包装它,这样它就会抛出异常。
试试这个:
byte valueA = 255;
byte valueB = 1;
byte valueC = (byte)(valueA + valueB);
Console.WriteLine("Without CHECKED: {0} + {1} = {2}", valueA.ToString(),
valueB.ToString(),
valueC.ToString());
try
{
valueC = checked((byte)(valueA + valueB));
Console.WriteLine("With CHECKED: {0} + {1} = {2}", valueA.ToString(),
valueB.ToString(),
valueC.ToString());
}
catch (Exception e)
{
Console.WriteLine("With CHECKED: " + e.GetType());
}
已在MSDN上检查