枚举标志不附加值

问题描述 投票:0回答:2

我在使用 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

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

c# enums flags
2个回答
5
投票

添加

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

[Flags]
public enum Categ
{
    None = 0,
    Doors = 1,
    Views = 2,
    Rooms = 4,
    Spaces = 8
    // then 16, 32, 64 etc.
}

1
投票

正如 @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
}
© www.soinside.com 2019 - 2024. All rights reserved.