私はテストプログラムを持っています。私は複数の条件をテストするフラグと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
ステートメントに入ります。
HasFlagの動作を見ていただきありがとうございます。代わりに私の定数をバイナリで宣言してから、手動でビット操作を行って正常に動作しました。代わりに私が答えとしてどうやって管理したかを投稿させてください – Joseph