4

[Flags]に起因する列挙を設定する一連の条件ステートメントを使用しようとしています。ただし、コンパイラは「m」が割り当てられていないと文句を言います。意図した機能を実現するために、次のように書き直すにはどうすればよいですか?

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;
4

6 に答える 6

17

mを初期化する必要があります。次に、値が0の「なし」フラグを作成します。

Media m = Media.None;

次に、残りのコード。

于 2009-04-10T19:54:08.123 に答える
2

次のように書くこともできます。

Media m = default(Media)

列挙型、クラス、またはそれが値/参照型であるかどうかがわからない場合に便利です。

于 2009-04-10T20:15:03.813 に答える
1

いずれの条件も真でない場合、mは未定義になります。初期値に設定してください。

于 2009-04-10T19:54:00.230 に答える
1

filterOptions.ShowNoneのような「デフォルト」はありますか?その場合は、mをそれに設定して開始します。コンパイラは、すべてのifの最後に、mが何にも設定されていない可能性があるために文句を言っています。

于 2009-04-10T19:54:49.667 に答える
0

上記の回答に加えて、このコードはかなり冗長に見えるという事実に加えて、これらの醜いIfの代わりにSelectCaseを使用することをお勧めします。

于 2009-04-10T20:06:44.333 に答える
-5

を作成する必要はありません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;
于 2009-04-10T20:04:09.177 に答える