2012-11-28 26 views
8

Wie erstelle ich eine Enumeration mit einem Nullwertinitialisieren Enum mit einem Nullwert

ex:

public enum MyEnum 
{ 
    [StringValue("X")] 
    MyX, 
    [StringValue("Y")] 
    MyY,  
    None 
} 

wo Wert Keiner ist null oder String.Empty

+1

'[String ("")] 'oder' [StringValue (null)] 'funktioniert nicht? – Rawling

+0

nicht es nicht: S –

+0

Mögliches Duplikat von [Wie Enum auf Null setzen] (http://stackoverflow.com/questions/4337193/how-to-set-enum-to-null) –

Antwort

15

Sie können wie etwas versuchen dies: -

public MyEnum? value= null; 

oder Sie können versuchen, diese: -

public MyEnum value= MyEnum.None; 
+0

Obwohl seine Frage danach fragt antworte es nicht, was er gefragt hat. –

+0

Ich denke, das OP bittet darum, dass ein Mitglied einer Enum einen "Null" -Wert hat. – Oded

+2

@jsobo was sie fragen ist unmöglich; das ist gut als Antwort IMO –

4

Alle enum-Typen Werttypen sind und die verschiedenen Elemente sind auch aus den Elementtypen (die zulässigen Typen sind byte, sbyte, short, ushort, int, uint, long oder ulong - wie documented) abgeleitet.

Dies bedeutet, dass Mitglieder einer Enumeration nicht null sein können.

Eine Möglichkeit, mit einem Standard-enum Wert zu behandeln ist, den None Wert als der erste Wert zu setzen und es auf einen negativen Wert (für signierte Aufzählungen) oder 0 Einstellung.

public enum MyEnum 
{ 
    [StringValue(null)] 
    None = -1, 
    [StringValue("X")] 
    MyX, 
    [StringValue("Y")] 
    MyY  
} 

Sie können einen null Verweis auf eine Aufzählung haben, wenn Sie eine Nullable-Instanz deklarieren - myenum?.

+0

Der Wert None sollte immer einen Wert von 0 haben. – erikkallen

+1

@erikkallen - Warum sollte es immer 0 sein. Es könnte auch -1 sein, es könnte eigentlich um jeden Wert, der in der gegebenen Situation eigentlich kein realer Wert sein kann. –

+0

Da der Standardinitialisierer einer Enumeration die Enumeration auf '(MyEnum) 0 'setzt. [FxCop stimmt zu] (http://msdn.microsoft.com/en-us/library/ms182149 (v = vs.80) .aspx). Vielleicht sollte aber keiner der Standard sein, z. Wenn Sie eine Liste mit "negativen Optionen" haben, sollte "Alle" der Standardwert sein. – erikkallen

4

Verwenden Sie das "?" oeprator für einen NULL-fähigen Typ !!

public MyEnum? myEnum= null; 
2

Es gibt keine "Aufzählung mit Nullwert". Eine Aufzählung in C# ist nur eine benannte Ganzzahl. In Ihrem Fall ist None nur ein Alias ​​für 2 (der Vollständigkeit halber MyX ist 0 und MyY ist 1). Der zugrunde liegende Datentyp einer Aufzählung ist standardmäßig int, aber es können auch andere ganzzahlige Basistypen unterschiedlicher Größe/Vorzeichen verwendet werden.

Wenn Sie eine "Null" enum möchten, müssten Sie MyEnum?, aka Nullable<MyEnum> verwenden.

5

Wie alle anderen Antworten gesagt, können Sie nicht einen Enum-Wert null haben. Was Sie können tun ist ein Description Attribut hinzufügen (wie StringValue), die einen Nullwert hat.

Zum Beispiel:

public enum MyEnum 
{ 
    [Description(null)] 
    None = 0, 
    [Description("X")] 
    MyX, 
    [Description("Y")] 
    MyY 
} 

Sie können die Beschreibung des Enum mit der folgenden Funktion erhalten:

public static string GetEnumDescription(Enum value) 
    { 
     FieldInfo fi = value.GetType().GetField(value.ToString()); 

     DescriptionAttribute[] attributes = 
      (DescriptionAttribute[])fi.GetCustomAttributes(
      typeof(DescriptionAttribute), 
      false); 

     if (attributes != null && attributes.Length > 0) 
      return attributes[0].Description; 
     else 
      return value.ToString(); 
    } 

Verbrauch:

MyEnum e = MyEnum.None; 
string s2 = GetEnumDescription((MyEnum)e); // This returns null