为什么抛出OverflowException?

时间:2014-01-07 21:53:41

标签: c# unchecked-conversion

我在一个方法中有以下代码将任何数字转换为一个字节:

try {
    return (byte) Convert.ChangeType(operand.RealValue, TypeCode.Byte);
}
catch (OverflowException) {
    if (AllowArithmeticOverflow) {
        unchecked {
            decimal d = Convert.ToDecimal(operand.RealValue);
            return (byte) d;
        }
    }

    throw;
}

在此代码中,operand.RealValue应为任意数字。对于我正在测试的示例,它是sbyte,其值为 -13 (通过调试器验证)。我可以在调试器中单步执行并转到行return (byte) d; ...此时抛出 OverflowException ,尽管它位于unchecked块中。

所以...给出了什么?

另外,如果你正在查看我的实施并想知道我到底在做什么 - 这是我迄今为止尝试过的所有体操的结果都没有得到这个例外。必须简洁的答案胜利:)

注意:异常消息如下:

  

System.OverflowException:值太大或太小   无符号字节。 ---> System.OverflowException:值也是   对于UInt32而言大或小。

3 个答案:

答案 0 :(得分:3)

显然,没有办法将-13解释为一个字节。至少除非你指定一些额外的上下文。也许你的意思是将-13视为无符号字符(-128和127之间的值),然后将这些位重新解释为有符号字符(字节)。

如果您正在尝试这样做,那么您可以使用BitConverter类。

答案 1 :(得分:0)

使用Convert.ChangeType引起异常..这就是为什么unchecked块可能无法在各种情况下工作的原因(以及为什么您无疑发布此问题)。

Convert.ChangeType最终致电IConvertible.To<TypeHere>ToByte上的System.SByte方法是这样的:

public static byte ToByte(sbyte value) {
    if (value < 0) {
        throw new OverflowException(Environment.GetResourceString("Overflow_Byte"));
    }

    return (byte)value;
}

它明确地抛出异常..因此unchecked为什么没用。

答案 2 :(得分:0)

来自你的评论:

  

基本上只是重新解释它...

我认为您希望将sbyte转换为值-13并将其解释为byte

所以简单地施展它:

sbyte s = -13;
byte u = (byte)s; // u = 243