[标志] 枚举元素上的二进制或 - 为什么不允许简单添加标志?

Binary OR on [Flags] Enumeration Elements - Why is simple addition of Flags not allowed?

[Flags]
public enum EyeColors
{
    None = 0,
    Blue = 1 << 0,
    Cyan = 1 << 1,
    Brown = 1 << 2,
    Black = 1 << 3,
    Green = 1 << 4,
    Browngreen = 2 | 4
    // Browngreen = Brown | Green
}

同时

Browngreen = 2 | 4
Browngreen = Brown | Green

有效

Browngreen = 6

没有。像

这样的测试评价
EyeColors.Browngreen == (EyeColors.Brown | EyeColors.Green);

Browngreen 设置为 6 的情况下计算为 false。


这让我很困惑。我理解二进制文件的方式或者是添加标记位以便:

0100 : 4
0010 : 2
0110 : 6

那为什么我刚设置就不行呢?

Browngreen = 6;

要组合标志,您需要使用 |操作员。 将其视为二进制:10000 & 00100 将给出 0 (None),但 10000 | 00100 将给出 10100,因此如您所料,为 20。

此外,在您的 "All" 案例中, "None" 标志没有任何意义,我将其删除。

这是一个工作示例:

[Flags]
public enum EyeColors
{
    None = 0,
    Blue = 1 << 0, // 1
    Cyan = 1 << 1, // 2
    Brown = 1 << 2, // 4
    Black = 1 << 3, // 8
    Green = 1 << 4, // 16
    Browngreen = Brown | Green,
    All = Blue | Green | Brown | Black | Cyan
}

void Main()
{
    EyeColors eyeColors = EyeColors.Brown;
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")");

    eyeColors = EyeColors.Brown & EyeColors.Green;
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")"); // None

    eyeColors = EyeColors.Brown | EyeColors.Green;  
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")"); // Brown green

    eyeColors = (EyeColors)20;
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")"); // Brown green also

    eyeColors = EyeColors.All;
    Console.WriteLine(eyeColors + " (" + (int)eyeColors + ")");
}