按位运算,ulong和int
问题描述:
我刚刚发现C#不会让您在ulong
和int
上执行按位运算。 int
,uint
,long
和ulong
的每一个其他组合都可以工作,但是那一个配对没有。按位运算,ulong和int
但是,如果不是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
,0short
,ushort
,uint
或ulong
,假设常数表达式i s在目标类型的范围内。
由于mask
的值,即,配合内ulong
,编译器执行促进代替触发错误的。
+0
这一切都有道理!谢谢。 – Bobson
你能展示一些可行的代码吗? –
@显示代码的费用。你在那种类型上执行什么样的操作 – Fabio
'const int'可能是在编译时执行的。 –