2017-11-02 10 views
0

私はテストプログラムを持っています。私は複数の条件をテストするフラグとenumを使用したいが、私は間違った結果を得る。私は列挙型を作成し、値を代入すると、私は期待値を得るように見えるいけない複数の条件でC#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"); 
} 

を私は正しい出力を取得します。私は複数のシナリオをしようとすると、次のように:私はSpouseフラグがオンになっていないよう

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ステートメントに入ります。

答えて

4

これは、あなたの列挙型で選択した整数値のためです。

は、次の点を考慮してください

HasFlag式は(int)EnumValue & (int)TargetValue = (int)TargetValue(ソース:https://msdn.microsoft.com/en-us/library/system.enum.hasflag.aspx?f=255&MSPPError=-2147217396)である

これを使用して、我々は基本的にするときAdditionalChildrenがあることを意味している

0xF & 0x0004戻り0x0004

を見ることができますセット、Spouseも設定されています。

また、MainLifePolicyPayerMainLifeの値は同じです。

+0

HasFlagの動作を見ていただきありがとうございます。代わりに私の定数をバイナリで宣言してから、手動でビット操作を行って正常に動作しました。代わりに私が答えとしてどうやって管理したかを投稿させてください – Joseph

関連する問題