为什么
byte someVar;
someVar -= 3;
合法但
byte someVar;
someVar = someVar - 3;
不是吗?
令人惊讶的是,当你对字节进行操作时,计算将使用int
值完成,首先会将字节隐式地转换为(int)
。这也适用于short
,类似地,在进行浮点运算时,float
被上升转换为double
。
第二个代码片段等同于:
byte someVar;
someVar = (int) someVar - 3;
因此,你必须将结果强制转换回 (byte)
,以使编译器接受赋值。
someVar = (byte) (someVar - 3);
byte v = 255;
v = (byte)(v + 1);
-=运算符存在问题,因为没有有效的方式应用所需的强制转换。它无法在语言语法中表示。使用(byte)3没有意义,文字本身也会被转换为int32以使运算符正常工作。
他们避免了这个问题,编译器会自动发出转换而不需要你的帮助。
-=
运算符在 IL 级别生成conv.u1
,这就是为什么第一个代码片段可以正常工作的原因。 - Thomas Levesquex op= y
作为x = (T)(x op y)
进行计算。这个规则是为了让预定义的运算符可用作复合运算符,当左操作数的类型为sbyte
、byte
、short
、ushort
或char
时。即使两个参数都属于这些类型,预定义的运算符也会生成一个int
类型的结果,如§7.3.6.2中所述。因此,如果没有强制转换,将无法将结果赋值给左操作数。” - Jeppe Stig Nielsen