2009-04-10 9 views
3

Ich versuche, eine Reihe von bedingten Anweisungen zu verwenden, die eine mit [Flags] zugewiesene Aufzählung einrichten. Der Compiler beklagt sich jedoch, dass 'm' nicht zugewiesen ist. Wie kann ich Folgendes umschreiben, um meine beabsichtigte Funktionalität zu erreichen?Flags enum in .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; 

Antwort

16

Sie müssen m initialisieren. Erstellen Sie ein "Kein" -Flag, das den Wert 0 hat, dann:

Media m = Media.None; 

Dann den Rest Ihres Codes.

1

Wenn keine der Bedingungen zutrifft, ist m undefiniert. Setze es auf einen Anfangswert.

1

Haben Sie einen 'Standard' wie filterOptions.ShowNone? Wenn ja, beginnen Sie mit m auf diesen Wert. Der Compiler beklagt sich, weil am Ende aller if's m nichts gesetzt ist.

-3

Sie müssen nicht wirklich eine Media.None erstellen. Sie können einen beliebigen Wert in die Flag-Enumerierung umwandeln, auch wenn sie nicht mit einem Wert der Flags übereinstimmt.

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

Was passiert, wenn alle Bedingungen fehlschlagen? Was ist, wenn 0 z.B. Medien.Audio? Sie benötigen einen * gültigen * Anfangswert. – EricSchaefer

+0

Das ist ein schlechter Ratschlag. Es ist immer besser, explizite Werte zu verwenden, als sich auf Integer-Umwandlungen zu verlassen. – Randolpho

+0

Nicht wirklich. Die Enum funktioniert auch dann einwandfrei, wenn kein "gültiges" Flag gesetzt ist. Es wird immer noch einen Wert geben. Alle Enums werden standardmäßig von "Int32" übernommen. Ja, später könnten andere Probleme auftreten, wenn Sie keine Standardwerte verwenden. Aber dafür gibt es Ausnahmen. –

0

Zusätzlich zu den oben genannten Antworten, neben der Tatsache, dass dieser Code ziemlich überflüssig scheint, würde Ich mag, dass Sie eine Select Case statt all diesen hässlichen Wenn die Nutzung vorzuschlagen.

+0

Angesichts der Tatsache, dass eine beliebige Kombination der Flags gesetzt werden konnte, sehe ich nicht, wie ein Select Case geeignet wäre. –

+0

Einverstanden, -1, weil Sie diese Wenns nicht mit einem Schalter ersetzen konnten. – Samuel

+0

Ok, also hatte ich eine gute gesunde Gehirnhälfte dort. – hmcclungiii

1

Man könnte auch schreiben:

Media m = default(Media) 

Nützlich in Fällen, in denen Sie nicht wissen, die Enum, Klasse, oder ob es ein Wert/Referenztyp ist.

+1

Das ist wirklich eine schlechte Idee, es verbirgt die ganze Einfachheit der Aufzählungen. Sie wurden erstellt, um magische Zahlen zu entfernen, und Sie fügen sie wieder hinzu, wenn eine None für eine Flag-Enumeration vorhanden sein sollte, die Sie stattdessen verwenden sollten. – Samuel

+0

Guter Punkt. Ich habe über den Fall nachgedacht, in dem Sie nicht der Autor sind, aber dann wäre die explizite Wahl der Vorgabe sowieso besser. –