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

问题描述:

我注意到在C#中使用byte s上的按位异或运算符有一些奇怪的地方。至少奇怪我的想法。C#异或运算符:^ vs^=和隐式类型转换

byte a = 0x11; 
byte b = 0xAA; 
a ^= b;   // works 
a = a^b;  // compiler error: Cannot implicitly convert type "int" to "byte" 

我也看到使用short这个问题,但没有intlong

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

+0

我同意这看起来很奇怪。尽管如此,@ matthew-flaschen钉了它。 – kbrimington 2010-07-29 21:03:23

没有异或运算符需要并返回字节。因此C#隐含地将输入字节扩展为整数。但是,它确实而不是隐含地缩小了结果int。因此,你在第二行得到了给定的错误。然而,§14.14.2的the standard(化合物赋值)规定:

如果返回 类型的选择的运营商是 显式转换为的 x中的类型,和如果y是隐式转换 到x或者运算符的类型是 移位运算符,则操作是 ,评估为x =(T)(x op y),其中T 是x的类型,除了x是 只计算一次。

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

在大多数C语言中,运营商会将小于int的类型推广到int

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