美好的一天!我试图添加两个字节变量,并注意到奇怪的结果。
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#:)抱歉这个问题。
答案 0 :(得分:17)
默认情况下,C#代码为unchecked
,因此溢出将以静默方式环绕而不是抛出异常。
您可以通过将代码包装在checked
块中来获得异常,但代价是性能稍差。
答案 1 :(得分:9)
因为默认情况下,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());
}
<强> checked @ MSDN 强>