为什么不选中不工作的字节?

A.s*_*lar 3 c#

unchecked关键字已在MSDN库中解释为:

unchecked关键字用于抑制整数类算术运算和转换的溢出检查.在未经检查的上下文中,如果表达式生成的值超出目标类型的范围,则不会标记溢出.

根据定义,它在int类型上运行良好.

例如:

unchecked
{
   int i=2147483647+10;
}
Run Code Online (Sandbox Code Playgroud)

这里它抑制了未经检查的块内的溢出.(它应该是)

但是当我们在字节上应用它时它不起作用

byte b1=100,b2=100,b3;
unchecked
{
   b3=b1+b2;//error here
}
Run Code Online (Sandbox Code Playgroud)

因此,应该抑制在未经检查的环境中编写的任何内容.

为什么它会给出编译时错误?

或者我根本不理解未经检查的关键字?

Jon*_*eet 9

你误解了目的unchecked.它有两个影响:

  • 它可以防止执行时溢出检查
  • 根据您的第一个示例,它允许您转换超出类型正常范围的量值.

不会更改表达式的类型.表达式b1 + b2int类型仍然是,因此您仍需要使用强制转换将其转换为byte.这种情况之间checked和之间的区别在于uncheckedint后端转换为溢出时溢出的执行时处理byte:

byte b1 = 255, b2 = 1;
unchecked
{
   byte b3 = (byte) (b1 + b2);
   // b3 is now 0
}
Run Code Online (Sandbox Code Playgroud)

使用检查算术:

byte b1 = 255, b2 = 1;
checked
{
   byte b3 = (byte) (b1 + b2); // OverflowException
}
Run Code Online (Sandbox Code Playgroud)