C#XOR运算符:^ vs ^ =和隐式类型转换

Odr*_*ade 5 c#

我注意到byte在C#中对s 使用按位XOR运算符有些奇怪.至少对我来说很奇怪.

byte a = 0x11;
byte b = 0xAA;
a ^= b;         // works
a = a ^ b;      // compiler error: Cannot implicitly convert type "int" to "byte"
Run Code Online (Sandbox Code Playgroud)

我也看到这个问题使用short,但不是int或long.

我认为最后两行是等价的,但似乎并非如此.这里发生了什么?

Mat*_*hen 9

没有xor运算符接收和返回字节.因此C#隐式地将输入字节扩展为整数.但是,它并没有隐含地缩小结果int.因此,您在第二行得到给定的错误.但是,该标准的 §14.14.2(复合赋值)规定:

如果所选运算符的返回类型可显式转换为x的类型,并且如果y可隐式转换为x的类型或运算符是移位运算符,则操作将被计算为x =(T)(x op y),其中T是x的类型,除了x仅被计算一次.

x和y(输入)都是字节.您可以显式地将int缩小为一个字节,显然一个字节可以隐式转换为一个字节.因此,有一个隐含的演员.