常量和文字显式转换

时间:2013-11-24 16:54:27

标签: c# unchecked-conversion

当我尝试以下内容时:

const int x = 1000;
byte b1 = (byte)x;

//Or

byte b2 = (byte)1000;

编译器声称它没有将常量1000转换为b1或b2。

但是当我尝试以下内容时:

const int x = 1000;
byte b1 = unchecked((byte)x);

//Or

byte b2 = unchecked((byte)1000);

这段代码很好。为什么?

2 个答案:

答案 0 :(得分:3)

  

编译器声称它没有将常量1000转换为b1或b2。

是的,因为在.NET Framework中,byte表示8位无符号整数,它可以保存从0255的值。

  

但是当我尝试以下内容时......这段代码运行正常。为什么?

当您使用unchecked关键字时,您允许溢出未标记。

  

如果删除未经检查的环境,则会发生编译错误。   可以在编译时检测溢出,因为所有条款   表达式是常量。

答案 1 :(得分:3)

很明显。

byte的范围是0-255。你试图把那1000个导致溢出。 unchecked允许它,因为

  

unchecked关键字用于抑制整数类算术运算和转换的溢出检查。