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

时间:2010-07-29 20:55:39

标签: c#

我注意到在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看到此问题,但不是intlong

我认为最后两行是等效的,但似乎并非如此。这是怎么回事?

2 个答案:

答案 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语言中,运营商会推广小于intint的类型。

在这些语言中,a op= b相当于a = (typeof a)(a op b)