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

时间:2017-11-02 23:31:41

标签: c# enums

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

这是我的枚举:

[Flags]
enum CoverOptionTypes
{
    MainLife = 0x0001,
    PolicyPayerMainLife = 0x0002,
    Spouse = 0x0004,
    Child = 0x0008,
    AdditionalChildren = 0xF
}

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

如果我这样做

var option = CoverOptionTypes.MainLife;

并测试以下内容:

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

我得到了正确的输出。当我尝试如下多个场景时:

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

我得到了这个输出

Main + Spouse + Child + Additional Children + PP Screen + Parents + Ext Family

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

1 个答案:

答案 0 :(得分:4)

很明白这是因为您为枚举选择的整数值。

请考虑以下事项:

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具有相同的值。