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都被视为布尔true值,因此!(faces & activeFace)在 C++ 中意味着:activeFace不在面孔中

于 2014-08-04T19:52:10.457 回答