C# 如何在if条件下使用标志

C# 如何在if条件下使用标志,c#,conditional-statements,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 | Empl

我有一个枚举的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;
}

此条件的预期结果为true,但结果为false。为什么?

您的枚举没有
[Flags]
属性

同时将if语句更改为

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

您的枚举没有
[Flags]
属性

同时将if语句更改为

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

|
并不意味着你认为它是什么,最好现在就不解释它。重要的是要测试“如果a或b”,您可以使用
if(a | | b)


|
并不意味着你认为它是什么,最好现在就不解释它。重要的是要测试“如果a或b”,您可以使用
if(a | | b)


这里有几件事你做错了:


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

  • 你不遵守国旗公约。除非
    Type3
    Type1
    Type2
    的组合,否则它的值应该是
    4
    ,而不是
    3
    。请仔细阅读中的文档

  • 您的期望是错误的:
    HasFlag(Flag1 | Flag2)
    只返回设置了Flag1和Flag2的true,因为您是按位或按位设置Flag1和Flag2,并检查这些位是否已设置。有关详细信息,请查看

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


因此,忘记标记的事情,只使用常规枚举匹配(例如
type==EmploymentType.Type1 | type==EmploymentType.Type2
开关
语句)而不是
hasvags
方法。

这里有几件事情你做错了:


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

  • 你不遵守国旗公约。除非
    Type3
    Type1
    Type2
    的组合,否则它的值应该是
    4
    ,而不是
    3
    。请仔细阅读中的文档

  • 您的期望是错误的:
    HasFlag(Flag1 | Flag2)
    只返回设置了Flag1和Flag2的true,因为您是按位或按位设置Flag1和Flag2,并检查这些位是否已设置。有关详细信息,请查看

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


因此,忘记标记的事情,只需使用常规枚举匹配(例如
type==EmploymentType.Type1 | type==EmploymentType.Type2
开关
语句)而不是
haslags
方法。

使用[flags]时,枚举值必须以基数2(二进制)为单位

[旗帜] 枚举日2 { 无=0x0, 星期日=0x1, 星期一=0x2, 星期二=0x4, 星期三=0x8, 星期四=0x10, 星期五=0x20, 星期六=0x40 } [旗帜] 公众宠物{ 无=0, 狗=1, Cat=2, 鸟=4, 兔子=8, 其他=16 }
使用[Flags]时,枚举值必须为基数2(二进制)

[旗帜] 枚举日2 { 无=0x0, 星期日=0x1, 星期一=0x2, 星期二=0x4, 星期三=0x8, 星期四=0x10, 星期五=0x20, 星期六=0x40 } [旗帜] 公众宠物{ 无=0, 狗=1, Cat=2, 鸟=4, 兔子=8, 其他=16 }
为什么不,
if(type==EmploymentType.Type1 | type==EmploymentType.Type2)
请阅读以下内容:。为什么不,
if(type==EmploymentType.Type1 | type==EmploymentType.Type2)
请阅读:。枚举值不是二的幂,因此,将它们视为标志不起作用。我觉得奇怪的是,他通常使用标志(在if语句中),没有注意到枚举中的第三个值实际上不是4…枚举值不是二的幂,因此将它们视为标志不起作用。我觉得奇怪的是,他通常使用标志(在if语句中),没有注意到枚举中的第三个值实际上不是4…希望看到DogBirdRabbit;)我很想看到一只狗 [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 }