如果条件如何使用标志

时间:2012-01-01 12:32:57

标签: c# conditional-statements

我有一个枚举的if条件。我的枚举是:

public enum EmploymentType
{
   Type1 = 1,
   Type2 = 2,
   Type3 = 3
}

和这个条件

EmploymentType type = EmploymentType.Type1 ;

if (type.HasFlag(EmploymentType.Type1 | EmploymentType.Type2 )) //if (type == (EmploymentType.Type1 | EmploymentType.Type2 ))
{
    return true;
}
else
{
    return false;
}

此条件的预期真实结果,但结果为假。为什么呢?

4 个答案:

答案 0 :(得分:3)

这里有一些你做错的事情:

  • 您的枚举没有[Flags]属性。 HasFlags仅适用于具有此属性集的枚举。

  • 您不遵循标志惯例。除非Type3Type1Type2的组合,否则它应该具有值4而不是3。阅读FlagsAttribute MSDN page

  • 中的文档
  • 您的期望是错误的:HasFlag(Flag1 | Flag2)仅返回两者的真实 Flag1和Flag2已设置,因为您按位 OR -ing Flag1和Flag2并检查这些位是否已设置。有关详细信息,请查看HasFlag documentation

我怀疑你的枚举是只是一个枚举而不是标志的容器。标志应该是可组合的,即类型可以是“Type1和Type2”或“no type”或“all types”(如字体格式,可以是“none”,“bold”,“italic”以及“粗体和斜体“,”粗体和下划线“等。我不认为这适用于你的情况。

所以,忘记标志事物,只使用常规枚举匹配(例如type == EmploymentType.Type1 || type == EmploymentType.Type2switch语句)而不是HasFlags方法。

答案 1 :(得分:1)

您的枚举没有[Flags]属性。

同时将您的if语句更改为

if (type.HasFlag(EmploymentType.Type1) || type.HasFlag(EmploymentType.Type2))

答案 2 :(得分:1)

使用[Flags]时,枚举值必须在Base 2(二进制)


    [Flags]
    enum Days2
    {
        None = 0x0,
        Sunday = 0x1,
        Monday = 0x2,
        Tuesday = 0x4,
        Wednesday = 0x8,
        Thursday = 0x10,
        Friday = 0x20,
        Saturday = 0x40
    }

    [Flags]
    public enum Pet {
       None = 0,
       Dog = 1,
       Cat = 2,
       Bird = 4,
       Rabbit = 8,
       Other = 16
    }

答案 3 :(得分:0)

|并不意味着你的想法,而且现在可能最好无法解释。重要的是,要测试“如果a或b”,您可以使用if (a || b)

if (type == EmploymentType.Type1 || type == EmploymentType.Type2)
{
    ...
}