什么是Enum.HasFlag应该返回?

时间:2013-11-18 20:45:27

标签: c# enums flags

我有枚举:

[Flags]
enum Editions
{
    Educational,
    Basic,
    Pro,
    Ultra
}

为什么我会出现这种行为?

var x = Editions.Basic;
var y = Editions.Educational;
var test =x.HasFlag(y); // why is this true!?
// and!!!
var test2 = y.HasFlag(x); // this is false!

2 个答案:

答案 0 :(得分:12)

使用[Flags]属性时,应将枚举值显式映射到包含非重叠位模式的整数。也就是说,每个枚举值应该映射到2的幂:

[Flags]
enum Editions
{
    Educational = 1,
    Basic = 2,
    Pro = 4,
    Ultra = 8
}

如果没有明确的编号,Educational将映射到0,Basic将映射为1。

Enum.HasFlags检查参数中设置的位字段或位字段是否也在测试的枚举中设置。在您的情况下,x为1且y为0.这意味着x包含0中设置的所有位(根本没有位)。但是,0在测试相反方式时不包含1中设置的位。

答案 1 :(得分:6)

它返回true,因为您错误地实现了Editions。您必须在使用[Flags]属性时显式设置值。

[Flags]
enum Editions
{                         //binary format
    Educational = 1 << 0, // 0001
    Basic  = 1 << 1,      // 0010
    Pro  = 1 << 2,        // 0100
    Ultra  = 1 << 3       // 1000
}

如果你没有指定数字,它会自动指定它们从0开始为每个选项后加1(这是标准的enum行为,添加[Flags]属性不会改变这种行为)

[Flags]
enum Editions
{                    //binary format
    Educational = 0, // 0000
    Basic  = 1,      // 0001
    Pro  = 2,        // 0010
    Ultra  = 3       // 0011
}

所以你做的两个测试是:0001设置了标志0000(这是真的,你没有测试任何标志)并且0000有标志{{1 set(默认是假的)


然而,看看你的名字,我怀疑你应该使用0001,因为我怀疑你在做什么,[Flags]并且同时成为Basic。如果您尝试使用标志来简化测试枚举值,则只需使用switch语句

Pro