编程语言
首页 > 编程语言> > c# – 为什么有赋值运算符(&=,=)但没有非赋值运算符(&,)用于短基元?

c# – 为什么有赋值运算符(&=,=)但没有非赋值运算符(&,)用于短基元?

作者:互联网

参见英文答案 > 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)等.

标签:c,operators,casting,assignment-operator,net
来源: https://codeday.me/bug/20190628/1315045.html