为什么对于十进制和>字节转换会发生OverflowExceptions,而对于uint->字节却不会发生?

时间:2011-10-19 22:33:20

标签: .net casting overflowexception

我想知道是否有人可以解释我看到的OverflowException。

请考虑以下代码:

        uint fred = 32768;
        byte wilma = (byte)fred;
        decimal bamBam = fred;
        wilma = (byte)bamBam;

我只在最后一行获得OverflowException(将decimal转换为byte时)。将uint中的相同值转换为byte时,我无法得到它。

我无法理解为什么会这样。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

当十进制超出字节范围(0到255)时,从十进制到字节的显式转换为documented to throw this exception

  

溢出异常:值小于Byte.MinValue或大于   Byte.MaxValue。

在第二行,您应该注意到值静默包装,wilma为0,因此合法转换中存在数据丢失。如果您希望看到与uint-to-byte积分转换相同的行为,则可以在已检查的上下文中运行。

checked
{
    uint fred = 32768;
    byte wilma = (byte)fred;
}

在未经检查的上下文中,对于整数类型之间的转换,将忽略溢出。高阶位被丢弃。 (参见:C#语言规范的第4.1.5节。)

  

已检查和未选中的运算符和语句用于控制   溢出检查积分型算术运算和   转换(第7.6.12节)。在检查的上下文中,溢出产生一个   编译时错误或导致抛出System.OverflowException。   在未经检查的上下文中,忽略溢出和任何高位   不符合目标类型的内容将被丢弃。

至于避免这些问题,请使用适合您所存储数据的类型。如果数据超出byte的范围,则使用更大的类型。积分类型和浮点数之间的转换特别成问题,因为后一个值的范围可能远远超过整数范围,当然,带小数位的数据丢失是不可避免的。

但是,如果继续使用十进制到字节的转换,则需要记住(并比较)byte的最小值和最大值。