[Flags] enum之间的意外行为:long vs [Flags] enum:ulong

时间:2014-03-12 22:49:06

标签: c# compiler-construction enums visual-studio-2013 enum-flags

编译但不应该

[Flags]
enum TransactionData : long  // 64 bits.  Last bit is sign bit, but I'm putting data there
{
    None = 0,
    Color1 = 1 << 63,
}

错误但不应该

[Flags]
enum TransactionData : ulong  // 64 bits. No sign bit.  Not allowed to put data there
{
    None = 0,
    Color1 = 1 << 63,
}

编译器错误文本:

  

-2147483648无法转换为ulong

问题:

我预计会发生相反的情况。谁能解释为什么会这样?

此外,我如何将此flags属性打印到byte[]进行检查?

 var eee  = TransactionData.None | TransactionData.Color1
 // How do I convert eee to byte[]?

1 个答案:

答案 0 :(得分:12)

请注意,1 << 63不是ulong,甚至不是long。编译器将其解释为int。请注意以下示例:

enum TransactionData : long
{
    None = 0,
    Color1 = 1 << 31,
    Color2 = 1 << 63,
}

Console.WriteLine(TransactionData.Color1 == TransactionData.Color2); // True

但是,你可以通过在末尾添加ulong来强制编译器将其解释为ul

enum TransactionData : ulong
{
    None = 0,
    Color1 = 1ul << 63,
}

虽然很多人更喜欢使用大写L,因为小写l看起来很像1。可以找到编译器支持的后缀的完整列表here

另外,我应该指出1ul << 63实际上是 64 位宽(它是一位,移位63位)。