为什么
Byte b = 400;
编译不通过,而
int a = 400;
Byte b = (Byte)a;
编译却能通过?
我来回答一下问题补充。
这里编译器的警告是正确的。
因为 Byte 表示一个8 位无符号整数,它只能表达区间[0,255]之间的整数。
400 明显超过了这个范围,加上 unchecked 关键字后,编译器做了转换,但是这个结果是不正确的。
注意,这里的转换是强制性的位数截断,所以结果不正确。
在楼主所举的能通过编译的例子中,计算过程是这样的:
400 表示的二进制数字为 00000000000000000000000110010000
中间经过位数截断后 b 成为 10010000
也就是仅仅保留了 400 的后 8 位.
由此可以看出类型转换时,高位数向低位数转换存在的风险。所以,我们在转换时,尤其是强制类型转换(即显式转换)时,应当小心不要跨越边界。
同时,我们也可以看出 C# 编译器的智能程度,它可以杜绝这方面的问题。只因为 C# 是门类型安全和元数据丰富的编程语言。
因为400是一个int的常量,而int不支持到byte的隐式转换
第二个代码,使用了int到byte的显式转换,而int是支持到byte的显式转换的
具体可以找本入门的书了解下隐式转换和显式转换的问题
学习....