我有一个枚举的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;
}
此条件的预期真实结果,但结果为假。为什么呢?
答案 0 :(得分:3)
这里有一些你做错的事情:
您的枚举没有[Flags]
属性。 HasFlags仅适用于具有此属性集的枚举。
您不遵循标志惯例。除非Type3
是Type1
和Type2
的组合,否则它应该具有值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.Type2
或switch
语句)而不是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)
{
...
}