我已经从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中是一样的,只需要在C#中添加[Flags]属性

最佳答案

我会在枚举中添加一个值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都被视为 bool true值,因此C++中的!(faces & activeFace)表示:activeFace在脸上是而不是

关于c# - 将按位比较从C++转换为C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25126285/

10-13 06:53