在多个条件下测试 C# 枚举标志

Jos*_*eph 2 c# enums

我有一个测试程序。我想使用enum带标志来测试多个条件,但我得到了错误的结果。

这是我的枚举:

[Flags]
enum CoverOptionTypes
{
    MainLife = 0x0001,
    PolicyPayerMainLife = 0x0002,
    Spouse = 0x0004,
    Child = 0x0008,
    AdditionalChildren = 0xF
}
Run Code Online (Sandbox Code Playgroud)

当我创建枚举并分配值时,我似乎没有得到预期值。

如果我这样做

var option = CoverOptionTypes.MainLife;

并使用以下内容进行测试:

if (option.HasFlag(CoverOptionTypes.MainLife)
{
    Console.WriteLine("Main + PP Screen + Parents + Ext Family");
}
Run Code Online (Sandbox Code Playgroud)

我得到正确的输出。当我尝试多种场景时:

var option = CoverOptionTypes.MainLife;
option |= CoverOptionTypes.PolicyPayerMainLife;
option |= CoverOptionTypes.Child;
option |= CoverOptionTypes.AdditionalChildren;


if (option.HasFlag(CoverOptionTypes.MainLife) && (
    option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
    !option.HasFlag(CoverOptionTypes.Spouse) &&
    !option.HasFlag(CoverOptionTypes.Child) &&
    !option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
    Console.WriteLine("Main + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) &&(
        option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
        option.HasFlag(CoverOptionTypes.Spouse) &&
        !option.HasFlag(CoverOptionTypes.Child) &&
    !option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
    Console.WriteLine("Main + Spouse + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) && (
         option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
         option.HasFlag(CoverOptionTypes.Spouse) && 
         option.HasFlag(CoverOptionTypes.Child) &&
         !option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
    Console.WriteLine("Main + Spouse + Child + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) && (
         option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
         option.HasFlag(CoverOptionTypes.Spouse) &&
         option.HasFlag(CoverOptionTypes.Child) &&
         option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
    Console.WriteLine("Main + Spouse + Child + Additional Children + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) && (
         option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
         !option.HasFlag(CoverOptionTypes.Spouse) &&
         option.HasFlag(CoverOptionTypes.Child) &&
         !option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
    Console.WriteLine("Main  + Child + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) && (
         option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
         !option.HasFlag(CoverOptionTypes.Spouse) &&
         option.HasFlag(CoverOptionTypes.Child) &&
         option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
    Console.WriteLine("Main  + Child + Additional Chidren + PP Screen + Parents + Ext Family");
}
Run Code Online (Sandbox Code Playgroud)

我得到这个输出

Main + Spouse + Child + Additional Children + PP Screen + Parents + Ext Family
Run Code Online (Sandbox Code Playgroud)

输出错误,因为我没有Spouse打开标志。当我调试时,我可以看到设置的标志,但 if 决定进入错误的if语句。

zai*_*man 5

很确定这是因为您为枚举选择了整数值。

考虑以下:

HasFlag公式是(int)EnumValue & (int)TargetValue = (int)TargetValue(来源:https : //msdn.microsoft.com/en-us/library/system.enum.hasflag.aspx?f=255&MSPPError=-2147217396

使用这个,我们可以看到

0xF & 0x0004 返回 0x0004

这基本上意味着何时AdditionalChildren设置,Spouse也设置。

此外,您的MainLifePolicyPayerMainLife具有相同的值。