枚举标志不附加值

Pas*_*t87 3 c# enums flags

我在使用 Flag 枚举时遇到一些问题。

我的枚举如下(我声明了 Flags 属性):

[Flags]
public enum Categ
{
    None = 0,
    Doors = 1,
    Views = 2,
    Rooms = 3,
    Spaces = 4
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在代码中使用它时,似乎不是附加最后一个值,而是替换第一个值:

var category = Categ.Doors | Categ.Rooms;
//category is always equal to Rooms only
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我是标志新手,所以也许我跳过了一些步骤。非常感谢!

Dav*_*idG 10

除了影响工作方式之外,添加[Flags]属性实际上不会对枚举执行任何操作.ToString()。您仍然需要为每个元素使用 2 的幂的值:

[Flags]
public enum Categ
{
    None = 0,
    Doors = 1,
    Views = 2,
    Rooms = 4,
    Spaces = 8
    // then 16, 32, 64 etc.
}
Run Code Online (Sandbox Code Playgroud)


swa*_*ken 7

正如@DavidG 所指出的,这些值必须是 2 的幂。确保这一点的其他选项是......

使用位移位:

[Flags]
public enum Categ
{
    None = 0,
    Doors = 1 << 0,
    Views = 1 << 1,
    Rooms = 1 << 2,
    Spaces = 1 << 3
}
Run Code Online (Sandbox Code Playgroud)

或者,从 C# 7.0 开始,使用二进制文字:

[Flags] 
public enum Categ
{ 
    None = 0b0000,
    Doors = 0b0001, 
    Views = 0b0010, 
    Rooms = 0b0100, 
    Spaces = 0b1000
}
Run Code Online (Sandbox Code Playgroud)