我有一个测试程序。我想使用带有标志的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
语句。
答案 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
也会设置。
此外,您的MainLife
和PolicyPayerMainLife
具有相同的值。