该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)
因此,应该抑制在未经检查的环境中编写的任何内容.
为什么它会给出编译时错误?
或者我根本不理解未经检查的关键字?
你误解了目的unchecked.它有两个影响:
它不会更改表达式的类型.表达式b1 + b2int的类型仍然是,因此您仍需要使用强制转换将其转换为byte.这种情况之间checked和之间的区别在于unchecked将int后端转换为溢出时溢出的执行时处理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)