[英]Bitwise operations, ulong and int
我刚刚发现C#不允许你对ulong
和int
执行按位操作。 int
, uint
, long
和ulong
每个其他组合都可以工作,但是一个配对没有。
但是 ,如果不是int
,我有一个const int
,一切都很好。
这里发生了什么? 为什么int & ulong
无效,但const int & ulong
有效吗?
破碎:
int mask = 0x1110;
ulong value = 0x1010;
var result = mask & value; // Compilation error: "Operator '&' cannot be applied to operands of type 'int' and 'ulong'"
工作:
const int mask = 0x1110;
ulong value = 0x1010;
var result = mask & value; // Works just fine.
此行为不是特定于按位操作。 根据C#语言规范 ,它适用于所有需要数字促销的二进制操作。
第7.6.3.2节描述了二进制数字促销。 我强调了指明您看到的行为的部分:
二进制数字促销包括按照它们在此处显示的顺序应用以下规则:
- 如果任一操作数的类型为
decimal
,则另一个操作数将转换为decimal
类型,或者如果另一个操作数的类型为float
或double
则会发生绑定时错误。- 否则,如果任一操作数的类型为
double
,则另一个操作数将转换为double
类型。- 否则,如果任一操作数的类型为
float
,则另一个操作数将转换为float
类型。- 否则,如果一个操作数的类型是
ulong
,则另一个操作数转换为类型ulong
,或者如果其他操作数的类型的发生结合时错误sbyte
,short
,int
,或long
。- 否则,如果任一操作数的类型为
long
,则另一个操作数将转换为long
类型。- 否则,如果任一操作数的类型为
uint
而另一个操作数的类型为sbyte
,short
或int,则两个操作数都将转换为long
类型。- 否则,如果任一操作数的类型为
uint
,则另一个操作数将转换为类型uint
。- 否则,两个操作数都将转换为
int
类型。
使用const
时不会发生问题的原因是允许编译器将const int
表达式转换为其他类型,如7.19节所述:
隐式常量表达式转换(第6.1.9节)允许将
int
类型的常量表达式转换为sbyte
,byte
,short
,ushort
,uint
或ulong
,前提是常量表达式的值在目标类型的范围内。
由于mask
的值(即0x1110
)适合ulong
,编译器会执行提升而不是触发错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.