5

コンパイルしますが、すべきではありません

[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[]?
4

1 に答える 1

13

またはでさえ1 << 63ないことに注意してください。コンパイラはそれを. 次の例に注意してください。ulonglongint

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ます。コンパイラでサポートされているサフィックスの完全なリストは、ここにあります。

また、これ1ul << 63は実際には64ビット幅 (63 ビット分シフトされた 1 ビット) であることに注意してください。

于 2014-03-12T22:50:49.460 に答える