我在使用 Flag 枚举时遇到一些问题。
我的枚举如下(我声明了 Flags 属性):
[Flags]
public enum Categ
{
None = 0,
Doors = 1,
Views = 2,
Rooms = 3,
Spaces = 4
}
但是当我尝试在代码中使用它时,似乎不是附加最后一个值而是替换第一个值:
var category = Categ.Doors | Categ.Rooms;
//category is always equal to Rooms only
我做错了什么?我是标志新手,所以也许我跳过了一些步骤。 非常感谢!
添加
[Flags]
属性除了影响 .ToString()
的工作方式外,实际上不会对枚举执行任何操作。您仍然需要为每个元素使用 2 的幂的值:
[Flags]
public enum Categ
{
None = 0,
Doors = 1,
Views = 2,
Rooms = 4,
Spaces = 8
// then 16, 32, 64 etc.
}
正如 @DavidG 所指出的,这些值必须是 2 的幂。确保这一点的其他选项是使用位移位:
[Flags]
public enum Categ
{
None = 0,
Doors = 1 << 0,
Views = 1 << 1,
Rooms = 1 << 2,
Spaces = 1 << 3
}
或者,从 C# 7.0 开始,二进制文字:
[Flags]
public enum Categ
{
None = 0b0000,
Doors = 0b0001,
Views = 0b0010,
Rooms = 0b0100,
Spaces = 0b1000
}