Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多个条件下测试C#枚举标志_C#_Enums - Fatal编程技术网

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

在多个条件下测试C#枚举标志,c#,enums,C#,Enums,我有一个测试程序。我想使用带有标志的enum来测试多个条件,但结果不正确 这是我的枚举: [Flags] enum CoverOptionTypes { MainLife = 0x0001, PolicyPayerMainLife = 0x0002, Spouse = 0x0004, Child = 0x0008, AdditionalChildren = 0xF } 当我创建枚举并赋值时,我似乎没有得到预期的值 如果我这样做 var option=Co

我有一个测试程序。我想使用带有标志的
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

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

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

考虑以下几点:

HasFlag
公式是
(int)EnumValue&(int)TargetValue=(int)TargetValue
(来源:)

利用这个,我们可以看到

0xF&0x0004
返回
0x0004

这基本上意味着当设置了
AdditionalChildren
时,也设置了
配偶


另外,您的
MainLife
PolicyPayerMainLife
具有相同的值。

非常感谢您,在了解了HasFlag的工作原理后,我设法用二进制声明了我的常量,然后手动执行位操作进行测试,效果很好。让我把我是如何做到的作为一个答案