我想知道是否有人可以解释我看到的OverflowException。
请考虑以下代码:
uint fred = 32768;
byte wilma = (byte)fred;
decimal bamBam = fred;
wilma = (byte)bamBam;
我只在最后一行获得OverflowException(将decimal
转换为byte
时)。将uint
中的相同值转换为byte
时,我无法得到它。
我无法理解为什么会这样。有什么建议吗?
答案 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的最小值和最大值。