我有一个测试程序。我想使用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
语句。
很确定这是因为您为枚举选择了整数值。
考虑以下:
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
具有相同的值。
归档时间: |
|
查看次数: |
1169 次 |
最近记录: |