-4

When i try the following :

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

//Or

byte b2 = (byte)1000;

The compiler claims that it didn't convert constant 1000 to b1 or b2.

But when i tried the following :

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

//Or

byte b2 = unchecked((byte)1000);

This code worked fine.Why?

4

2 回答 2

3

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

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

但是当我尝试以下...此代码工作正常。为什么?

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

如果取消选中的环境,则会出现编译错误。溢出可以在编译时检测到,因为表达式的所有项都是常量。

于 2013-11-24T16:58:28.617 回答
3

这很明显。

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

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

于 2013-11-24T16:58:33.393 回答