繁体   English   中英

Enum.HasFlag应该返回什么?

[英]What is Enum.HasFlag supposed to return?

我有枚举:

[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!

使用[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的位。

它返回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开始分配它们,然后为每个选项enum 1(这是标准enum行为,添加[Flags]属性不会更改此行为)

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

因此,您进行的两个测试是: 0001设置了标志0000 (这是真的,您没有测试任何标志),而0000设置了标志0001 (绝对是错误的)


但是,看看您的名字,我怀疑您是否应该使用[Flags] ,因为我怀疑您所做的任何事情都可以同时成为BasicPro 如果您尝试使用标志来简化测试枚举值,则只需使用switch语句即可

Editions edition = GetEdition();

switch(edition)
{
    case Editions.Basic:
         DoSomthingSpecialForBasic();
         break;

    case Editions.Pro:
    case Editions.Ultra:
        DoSomthingSpecialForProAndUltra();
        break;

    //Does not do anything if Editions.Educational
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM