如何使用标志如果条件
我有一个如果条件为一个枚举。我的枚举是:如何使用标志如果条件
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;
}
预期的真实结果此条件,但结果是假的。为什么?
有你做错了几件事情:
您枚举没有
[Flags]
属性。 HasFlags被设计为仅与使用该属性集的枚举一起工作。你不遵循标志约定。除非
Type3
是Type1
和Type2
的组合,它应该具有值4
而不是3
。请阅读FlagsAttribute MSDN page中的文档。你的期望是错误的:
HasFlag(Flag1 | Flag2)
只返回的真实都标志1和标志2设置,既然你是按位OR -ing标志1和标志2,如果这些位被设置检查。详情请看HasFlag documentation。
我怀疑你的枚举,就是要只是标志枚举而不是容器。标志应该是可组合的,即,类型可以是“Type1和Type2”或“无类型”或“所有类型”(如字体格式,可以是“无”,“粗体”,“斜体”以及“大胆和斜体“,”粗体和下划线“等)。我认为这不适用于你的情况。
因此,忘记标志事物,只是使用常规枚举匹配(如type == EmploymentType.Type1 || type == EmploymentType.Type2
或switch
语句)而不是HasFlags
方法。
您的枚举没有[Flags]
属性。
而且改变你的if语句
if (type.HasFlag(EmploymentType.Type1) || type.HasFlag(EmploymentType.Type2))
枚举值不是两个幂,因此将它们作为标志处理将不起作用。 – hvd 2012-01-01 12:39:09
除了'[Flags]'的编号应该是1,2,4,8,... – 2012-01-01 12:40:04
对我来说,他似乎很奇怪他一般使用标志(在if语句中),没有注意到枚举中的第三个值实际上不是4 ... – 2012-01-01 12:45:08
|
并不意味着你所想象的那样,这也许最左不明原因的现在。重要的是,以测试“如果A或B”,你可以使用if (a || b)
:
if (type == EmploymentType.Type1 || type == EmploymentType.Type2)
{
...
}
当您使用[标志]枚举值必须在基地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 }
很想看到DogBirdRabbit;) – BlueChippy 2012-01-03 09:36:12
为什么不呢,'如果(类型== EmploymentType.Type1 ||类型== EmploymentType.Type2)' – 2012-01-01 12:36:11
请阅读此:[枚举标志属性](http://*.com/questions/8447/enum-flags-attribute)。 – 2012-01-01 12:36:31