我注意到在C#中使用byte
s上的按位XOR运算符有些奇怪。至少在我的脑海里。但
byte a = 0x11;
byte b = 0xAA;
a ^= b; // works
a = a ^ b; // compiler error: Cannot implicitly convert type "int" to "byte"
我也使用short
看到此问题,但不是int
或long
。
我认为最后两行是等效的,但似乎并非如此。这是怎么回事?
答案 0 :(得分:9)
没有xor运算符接收并返回字节。因此C#隐式地将输入字节扩展为整数。但是,不会隐式缩小结果int。因此,您在第二行得到给定的错误。但是,the standard的§14.14.2(复合赋值)规定:
如果退货 所选运算符的类型是 明确可转换为类型 x,如果y是可隐式转换的 到x的类型或运算符是 换班操作员,那么操作就是 评估为x =(T)(x op y),其中T 是x的类型,除了x是 只评估一次。
x和y(输入)都是字节。您可以显式地将int缩小为一个字节,显然一个字节可以隐式转换为一个字节。因此,有一个隐含的演员。
答案 1 :(得分:1)
在大多数类C语言中,运营商会推广小于int
到int
的类型。
在这些语言中,a op= b
相当于a = (typeof a)(a op b)