4

編譯,但不應該意外行爲:長VS [國旗]枚舉:ULONG

[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

問:

我會希望出現相反的。任何人都可以解釋爲什麼這是?

另外我如何可以打印此標誌屬性爲byte[]進行檢查?

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

回答

11

注意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其實是位寬(它是一位,移位63位)。

+0

gahh ...謝謝! – LamonteCristo

+0

有趣的是,我一直在用C#工作了8年,並剛剛學會了追加字母以將數字投射到不同類型的概念。不知道有多少人和我在同一條船上。 – LamonteCristo

+0

你知道我怎麼能把這個ULong枚舉變成一個Byte []偶發嗎? (ps會接受你的無論在6分鐘..當超時到期 – LamonteCristo