参见英文答案 > Integer summing blues, short += short problem 5个
我偶然发现在小于32位的基本类型上不允许按位或算术运算的行为,但事实上允许相应的赋值操作:
short BitwiseAnd(short a, short b) { return a & b; } // error
short BitwiseAndAssignment(ref short a, short b) { a &= b; } // works
short Add(short a, short b) { return a + b; } // error
short AddAssignment(ref short a, short b) { a += b; } // works
对于其他短基本类型(如byte,sbyte和ushort),同样的行为也适用.
我知道算术和逻辑运算是针对32位和更大的类型(int,long …)定义的,因为它是处理器提供的(see this question),更短的类型被加宽并且可以返回到8位或16位.但是,为什么这可以在赋值运算符中起作用?首先我假设在幕后,短路被转换为int,但是你会有一个赋值/返回值short value =(some int),这会产生错误,因为强制转换不是隐含的.
另外一点:我在Visual Studio的即时窗口中尝试了一些代码,但是在那里,还有更多代码可以工作.即时窗口可能会执行一些隐式转换,这通常是明确的.例如,短a =(int)5;允许在即时窗口中.所以这没有帮助.
解决方法:
However, is there a reason why this would work in an assignment operator?
是的:因为否则赋值运算符永远不能用于这些类型 – 没有语法允许它工作. a = b或a& = b的期望是明确的,因此转换是自动执行的.
使用b或a& b,正如您已经注意到的那样:出于性能原因,这种情况已经扩大;语法存在将其放回去,特别是(短)(a b)等.