編集:ほとんどの人が私の質問を誤解しているようです.
私は列挙型がどのように機能するかを知っており、バイナリも知っています。[Flags] 属性を持つ列挙型がそのように設計されている理由が不思議です。
元の投稿:
これは重複している可能性がありますが、他の投稿が見つからなかったので、ここに行きます.
その背後には何らかの正当な理由があるに違いありませんが、少しバグが発生しやすいと思います。
[Flag]
public enum Flagged
{
One, // 0
Two, // 1
Three, // 2
Four, // 3
}
Flagged f; // Defaults to Flagged.One = 0
f = Flagged.Four;
(f & Flagged.One) != 0; // Sure.. One defaults to 0
(f & Flagged.Two) != 0; // 3 & 1 == 1
(f & Flagged.Three) != 0; // 3 & 2 == 2
このようなことをしたら、もっと意味があったのではないでしょうか?
[Flag]
public enum Flagged
{
One = 1 << 0, // 1
Two = 1 << 1, // 2
Three = 1 << 2, // 4
Four = 1 << 3, // 8
}
Flagged f; // Defaults to 0
f = Flagged.Four;
(f & Flagged.One) != 0; // 8 & 1 == 0
(f & Flagged.Two) != 0; // 8 & 2 == 0
(f & Flagged.Three) != 0; // 8 & 4 == 0
(f & Flagged.Four) != 0; // 8 & 8 == 8
もちろん..このようなカスタムフラグをどのように処理する必要があるかはよくわかりません
[Flag]
public enum Flagged
{
One, // 1
Two, // 2
LessThanThree = One | Two,
Three, // 4? start from Two?
LessThanFour = Three | LessThanThree,
Three, // 8? start from Three?
}
仕様はいくつかのガイドラインを提供します
2 の累乗、つまり 1、2、4、8 などで列挙定数を定義します。これは、組み合わせた列挙定数の個々のフラグが重複しないことを意味します。
しかし、私の最初の例が発生することを決して望んでいないに違いないので、これはおそらく自動的に行われるべきです。教えてください:)