2009-04-10 12 views
3

[Flags]の列挙型を設定する一連の条件文を使用しようとしています。しかし、コンパイラは 'm'が割り当てられていないと訴える。意図した機能を達成するために、次のような書き換えはできますか?.NETの列挙型フラグ

Media m; 
if (filterOptions.ShowAudioFiles) 
    m = m | Media.Audio; 
if (filterOptions.ShowDocumentFiles) 
    m = m | Media.Document; 
if (filterOptions.ShowImageFiles) 
    m = m | Media.Image; 
if (filterOptions.ShowVideoFiles) 
    m = m | Media.Video; 

答えて

16

mを初期化する必要があります。次に、あなたのコードの残りの部分を

Media m = Media.None; 

:その後、値0を持つ「なし」のフラグを作成します。

1

真でない場合、mは未定義です。初期値に設定してください。

1

filterOptions.ShowNoneのような 'デフォルト'がありますか?もしそうなら、それをmにセットして始めてください。コンパイラは、すべてのifの最後にmが何も設定されていない可能性があるため、不平を言っています。

-3

Media.Noneを作成する必要はありません。フラグの値と等しくなくても、任意の値をフラグ列挙型にキャストできます。上記の回答に加えて

Media m = (Media)0; 

if (filterOptions.ShowAudioFiles)  m |= Media.Audio; 

if (filterOptions.ShowDocumentFiles) m |= Media.Document; 

if (filterOptions.ShowImageFiles)  m |= Media.Image; 

if (filterOptions.ShowVideoFiles)  m |= Media.Video; 
+0

すべての条件が満たされない場合はどうなりますか? 0の場合Media.Audio? *有効な初期値が必要です。 – EricSchaefer

+0

これは悪いアドバイスです。整数型キャストに頼るよりも、明示的な値を使用する方が良いでしょう。 – Randolpho

+0

実際にはありません。 "有効な"フラグが設定されていなくても、enumは完全に正常に動作します。それでも価値があります。すべてのenumは、デフォルトで "Int32"から継承されます。はい、後でデフォルト値を処理しないと他の問題が発生する可能性があります。しかしそれは例外のためのものです。 –

0

、このコードはかなり冗長なようだという事実以外に、私はあなたの代わりにの場合は醜いすべてのそれらの選択ケースを使用することをお勧めしたいと思います。

+0

フラグの組み合わせを設定できることを考慮すると、Select Caseがどのように適切であるかはわかりません。 –

+0

合意しました。あなたがそれらのifをスイッチで置き換えることができなかったからです。 – Samuel

+0

だから、私はそこに良い健全な脳を持っていた。 – hmcclungiii

1

また書くことができます:あなたが列挙型、クラス、またはそれが値/参照型だかどうかが分からない場合は

Media m = default(Media) 

便利に。

+1

これは本当に悪い考えです。列挙の単純さがすべて隠されています。それらはマジックナンバーを削除するために作成されたもので、フラグenumの代わりにNoneを指定すると、代わりに使用する必要があります。 – Samuel

+0

良い点。私はあなたが作者ではないケースについて考えていましたが、デフォルトの明示的な選択はとにかく良いでしょう。 –