2016-12-14 97 views
7

我刚刚发现C#不会让您在ulongint上执行按位运算。 int,uint,longulong的每一个其他组合都可以工作,但是那一个配对没有。按位运算,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. 
+0

你能展示一些可行的代码吗? –

+0

@显示代码的费用。你在那种类型上执行什么样的操作 – Fabio

+0

'const int'可能是在编译时执行的。 –

回答

9

此行为是不特定的位操作。根据C#语言规范,它适用于所有需要数字促销的二元操作。

7.6.3.2节介绍了二进制数字促销活动。我强调的是,指定您看到的行为的部分:

二元数值提升应按下列规则,秩序的,他们出现在这里:

  • 如果操作数是decimal类型中,其他操作数转换为decimal类型,或者如果另一个操作数的类型为floatdouble,则会发生绑定时错误。
  • 否则,如果其中一个操作数的类型为double,则另一个操作数转换为double
  • 否则,如果任一操作数的类型为float,则另一操作数转换为float
  • 否则,如果操作数是ulong类型的,则另一个操作数转换为类型ulong,或者如果其他操作数是sbyte类型,shortint,或long的发生结合时错误。
  • 否则,如果其中一个操作数的类型为long,则另一个操作数转换为long
  • 否则,如果其中一个操作数的类型为uint,另一个操作数的类型为sbyteshort或int,则两个操作数都将转换为long类型。
  • 否则,如果其中一个操作数的类型为uint,则另一个操作数转换为uint类型。
  • 否则,两个操作数都转换为int类型。

的原因,当您使用const不会发生的问题是,编译器允许const int表达式转换为其他类型,如第7.19描述:

隐式常量表达式转换(§6.1.9)允许将int类型的常量表达式转换为sbyte,byte,0 short,ushort,uintulong,假设常数表达式i s在目标类型的范围内。

由于mask的值,即,配合内ulong,编译器执行促进代替触发错误的。

+0

这一切都有道理!谢谢。 – Bobson