【发布时间】:2015-12-14 02:49:54
【问题描述】:
我偶然发现在小于 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 位。但是,这是否有理由在赋值运算符中起作用?首先,我假设在幕后,shorts 被强制转换为int,但随后您将有一个赋值/返回值short value = (some int),这应该会产生错误,因为强制转换不是隐式的。
另一种说法:我在 Visual Studio 的即时窗口中尝试了一些代码,但似乎还有更多代码可以工作。即时窗口可能会进行一些通常是显式的隐式转换。例如,short a = (int)5; 允许在即时窗口中使用。所以这没有帮助。
【问题讨论】:
-
short Add(short a, short b) { return (short)(a + b); }
-
re
short a = (int)5;在即时窗口中 - 也适用于常规 C#;这里的值5和(int)5可以在编译时作为常量表达式完全处理和理解;编译器检查这些常量表达式是否溢出等,并允许它。相反,如果您执行short a = (int)50000000;,编译器会在编译时(而不是运行时)中断CS0031。 -
我明白了,谢谢!我没有注意到编译时常量替换。它只是因为语法上下文而有所不同,这使它在即时窗口中起作用,但在我的实际代码中不起作用(因为它不能被那里的常量表达式替换)。
标签: c# .net casting operators assignment-operator