[标志] 枚举元素上的二进制或 - 为什么不允许简单添加标志?
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 + ")");
}
[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 + ")");
}