9

私はcppソースから与えられた条件を持っています。

if (!(faces & activeFace) || [...]) { ... }

これをC#に翻訳したい。

私がこれを正しく理解すると、これは同じくらい意味しますif activeFace is *not* in faces then...-そうではありませんか?

では、C# でこれに相当するものは何でしょうか?
注:使えませんfaces.HasFlag(activeFace)

まあ、そうあるべきだ

if ((faces & activeFace) == 0 || [...]) { ... }

私は正しいですか?

ここで完全を期すために、実際の Flag 列挙型

[Flags]
enum Face {
    North = 1,
    East = 2,
    South = 4,
    West = 8,
    Top = 16,
    Bottom = 32
};

cppでも同じです[Flags]。C#で属性を追加するだけです

4

1 に答える 1

5

None = 0列挙型に値を追加します

[Flags]
enum Face {
    None = 0,
    North = 1,
    East = 2,
    South = 4,
    West = 8,
    Top = 16,
    Bottom = 32
};

そしてテスト

if ((faces & activeFace) == Face.None || otherExpr) {
    ...
}

列挙型に定数を追加する正当な理由0は、クラス フィールドがデフォルトでゼロに設定されているためです。定数を省略すると、列挙型0定数に対応しない列挙値が生成されます。C# でこれを行うことは合法ですが、良い習慣ではありません。C# は、列挙型に割り当てられた値が有効な列挙型定数であるかどうかをテストしません。

ただし、列挙型を変更できない場合は、列挙型の値をキャストできますint

if ((int)(faces & activeFace) == 0 || otherExpr) {
    ...
}

はい、C++ では、int等しくないものはブール0と見なされるため、C++ では次のようになります。true!(faces & activeFace)

于 2014-08-04T19:52:10.457 に答える