2012-01-01 81 views
1

我有一个如果条件为一个枚举。我的枚举是:如何使用标志如果条件

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; 
} 

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

+0

为什么不呢,'如果(类型== EmploymentType.Type1 ||类型== EmploymentType.Type2)' – 2012-01-01 12:36:11

+1

请阅读此:[枚举标志属性](http://stackoverflow.com/questions/8447/enum-flags-attribute)。 – 2012-01-01 12:36:31

回答

3

有你做错了几件事情:

  • 您枚举没有[Flags]属性。 HasFlags被设计为仅与使用该属性集的枚举一起工作。

  • 你不遵循标志约定。除非Type3Type1Type2的组合,它应该具有值4而不是3。请阅读FlagsAttribute MSDN page中的文档。

  • 你的期望是错误的:HasFlag(Flag1 | Flag2)只返回的真实标志1和标志2设置,既然你是按位OR -ing标志1和标志2,如果这些位被设置检查。详情请看HasFlag documentation

我怀疑你的枚举,就是要只是标志枚举而不是容器。标志应该是可组合的,即,类型可以是“Type1和Type2”或“无类型”或“所有类型”(如字体格式,可以是“无”,“粗体”,“斜体”以及“大胆和斜体“,”粗体和下划线“等)。我认为这不适用于你的情况。

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

1

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

而且改变你的if语句

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

枚举值不是两个幂,因此将它们作为标志处理将不起作用。 – hvd 2012-01-01 12:39:09

+2

除了'[Flags]'的编号应该是1,2,4,8,... – 2012-01-01 12:40:04

+0

对我来说,他似乎很奇怪他一般使用标志(在if语句中),没有注意到枚举中的第三个值实际上不是4 ... – 2012-01-01 12:45:08

0

|并不意味着你所想象的那样,这也许最左不明原因的现在。重要的是,以测试“如果A或B”,你可以使用if (a || b)

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

当您使用[标志]枚举值必须在基地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 
    } 

+0

很想看到DogBirdRabbit;) – BlueChippy 2012-01-03 09:36:12