0

私は何か非常にばかげたことをしているに違いありませんが、何がわかりません。私が持っている単純なコンソールアプリでは;

[Flags]
public enum ConsoleStates : byte
{
    TopLevel,
    All,
    MainMenu,
    SingleLeagueSelected,
}

それから

public class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        p.StartUp(args);
    }

    private bool CheckFlag(ConsoleStates targetVal, ConsoleStates checkVal)
    {
        return ((targetVal & checkVal) == checkVal);
    }

    private void StartUp(string[] args)
    {
        int x = 0;
        ConsoleStates states = (ConsoleStates.All | ConsoleStates.MainMenu);
        if (CheckFlag(states, ConsoleStates.SingleLeagueSelected))
        {
            x++;
        }
     }
}

私の問題 X は最後にゼロになるはずですが、常に 1 です。私が理解しているように、少し賢明な AND 演算を実行し、singleleagueSelected がそこにあるかどうかを確認し、false を返す必要があります。

それは非常に奇妙で、私のグーグルはこれが非常にシンプルでうまくいくと言っていますが、私の人生ではそれを得ることができません. /恥ずかしそうに頭を下げる。

4

3 に答える 3

5

列挙型は、デフォルトで 0、1、2、3、... の値を持ちます。私の知る限り、FlagsAttribute を追加してもこれは変わりません。必要な値を明示的に設定する必要があると思います。たとえば、次のようになります。

[Flags]
public enum ConsoleStates : byte
{
    TopLevel = 0,
    All = 1,
    MainMenu = 2,
    SingleLeagueSelected = 4,
}
于 2011-11-15T23:13:28.673 に答える
2

列挙型は 0 から連続して番号付けされます。ビット フラグを使用するには、2 のべき乗として手動で番号を付ける必要があります。

于 2011-11-15T23:11:20.563 に答える
1

.NET 4.0 を使用している場合は、Enum.HasFlag()メソッドを使用して、列挙型に特定のビット値が含まれているかどうかを確認できます。この質問の私の答えを見てください。

于 2011-11-15T23:16:46.043 に答える