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
这个问题,但没有int
或long
。
我认为最后两行是相同的,但似乎并非如此。这里发生了什么?
答
没有异或运算符需要并返回字节。因此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)
我同意这看起来很奇怪。尽管如此,@ matthew-flaschen钉了它。 – kbrimington 2010-07-29 21:03:23