我刚刚发现,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.发布于 2016-12-14 15:41:54
此行为不特定于按位操作。根据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,所以编译器执行提升而不是触发错误。
https://stackoverflow.com/questions/41146148
复制相似问题