我们知道这两个加法语句是等价的,并且编译成相同的 IL 代码:
int x = 100;
x += 100;
x = x + 100;
但是,当需要明确的演员表时,我注意到了一些奇怪的事情:
byte b = 100;
b += 200; // Compiles (1)
b = b + 200; // Cannot implicitly convert int to byte (2)
b = (byte) (b + 200); // Compiles (3)
很明显为什么第二个语句需要显式转换,因为加法的结果是整数。但对我来说奇怪的是第一个陈述。它编译为与第三条语句完全相同的 IL,因此看起来编译器添加了一个对我们来说应该是显式的强制转换。但它不能在第二个语句中做到这一点。
这对我来说似乎是矛盾的,因为我希望第一个语句等同于第二个并且永远不会编译,那么为什么它会编译呢?
注意:当需要从longto显式转换时,这不会编译int:
int x = 100;
long y = 200;
x += y;
慕森王
相关分类