So setzen Sie enum auf null

191

Ich habe eine Aufzählung

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

So setzen Sie es beim Laden auf NULL.

name = "";
Color color = null; //error

Bearbeitet: Mein schlechtes, ich habe es nicht richtig erklärt. Aber alle Antworten in Bezug auf nullable sind perfekt. Meine Situation ist Was wäre, wenn ich für die Aufzählung in einer Klasse mit anderen Elementen wie Name usw. get / set habe. Beim Laden der Seite initiiere ich die Klasse und versuche, die Werte standardmäßig auf null zu setzen. Hier ist das Szenario (Code ist in C #):

namespace Testing
{
    public enum ValidColors
    {
        Red,
        Green,
        Yellow
    }

    public class EnumTest
    {
        private string name;
        private ValidColors myColor;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public ValidColors MyColor
        {
            get { return myColor; }
            set { myColor = value; }
        }

    }

    public partial class _Default : System.Web.UI.Page
    {       
        protected void Page_Load(object sender, EventArgs e)
        {
            EnumTest oEnumTest = new EnumTest();
            oEnumTest.Name = "";
            oEnumTest.MyColor = null; //???
        }
    }

}

Dann habe ich anhand der folgenden Vorschläge den obigen Code geändert, damit er mit den Methoden get und set funktioniert. Ich muss nur "?" in der EnumTest-Klasse während der Deklaration der privaten Enum-Variablen und in der get / set-Methode:

public class EnumTest
{
    private string name;
    private ValidColors? myColor; //added "?" here in declaration and in get/set method

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public ValidColors? MyColor
    {
        get { return myColor; }
        set { myColor = value; }
    }

}

Vielen Dank für die schönen Vorschläge.

Sri Reddy
quelle
Mögliches Duplikat von C # -Aufzählungen: Nullable oder 'Unknown' Value?
Michael Freidgeim

Antworten:

370

Sie können entweder das "?" Operator für einen nullbaren Typ.

public Color? myColor = null;

Oder verwenden Sie die Standardpraxis für Aufzählungen, die nicht null sein können, indem der ERSTE Wert in der Aufzählung (auch bekannt als 0) der Standardwert ist. Zum Beispiel in einem Fall von Farbe Keine.

public Color myColor = Color.None;
Rodney S. Foley
quelle
@equiman keine Besetzung erforderlich, da der Typ links angegeben ist. Sie duplizieren im Grunde den ersten Teil meiner Antwort, der bereits akzeptiert wurde.
Rodney S. Foley
7
Dies beantwortete meine Frage: Können Sie 'hinzufügen?' zu enumname, um es nullbar zu machen?
LuckyLikey
für diejenigen, die bereits den nullbaren Typ in ihrer Klasse deklariert haben und hierher kommen: myColor = (Color?) null;
StefanJanssen
@StefanJanssen Sie müssen die Null nicht umwandeln, wenn es sich bereits um einen deklarierten nullbaren Farbtyp handelt. Nur myColor = null ist in Ordnung.
Rodney S. Foley
Ich weiß nicht, worum es dann geht, aber für meinen Compiler gab es Fehler, bis ich die Besetzung machte.
StefanJanssen
43

Wenn dies C # ist, funktioniert es nicht: Aufzählungen sind Werttypen und können es nicht sein null.

Die normalen Optionen sind das Hinzufügen eines NoneMitglieds:

public enum Color
{
  None,
  Red,
  Green,
  Yellow
}

Color color = Color.None;

... oder zu verwenden Nullable:

Color? color = null;
Tim Robinson
quelle
24

Machen Sie Ihre Variable nullbar. Mögen:

Color? color = null;

oder

Nullable<Color> color = null;
Cj S.
quelle
9

Eine Aufzählung ist ein "Wert" -Typ in C # (bedeutet, dass die Aufzählung als beliebiger Wert gespeichert wird, nicht als Referenz auf eine Stelle im Speicher, an der der Wert selbst gespeichert ist). Sie können Werttypen nicht auf null setzen (da null nur für Referenztypen verwendet wird).

Davon abgesehen können Sie die integrierte Nullable<T>Klasse verwenden, die Werttypen so umschließt, dass Sie sie auf null setzen, prüfen, ob sie vorhanden sind, HasValueund die tatsächliche Klasse abrufen Value. (Dies sind beide Methoden für die Nullable<T>Objekte.

name = "";
Nullable<Color> color = null; //This will work.

Es gibt auch eine Verknüpfung, die Sie verwenden können:

Color? color = null;

Das ist das gleiche wie Nullable<Color>;

Chris Pfohl
quelle
3

Ich gehe hier von c ++ aus. Wenn Sie c # verwenden, ist die Antwort wahrscheinlich dieselbe, aber die Syntax ist etwas anders. Die Aufzählung besteht aus einer Reihe von int-Werten. Es ist kein Objekt, daher sollten Sie es nicht auf null setzen. Wenn Sie etwas auf Null setzen, zeigen Sie mit einem Zeiger auf ein Objekt, um Null zu adressieren. Mit einem Int kann man das nicht wirklich machen. Was Sie mit einem int tun möchten, ist, es auf einen Wert zu setzen, bei dem Sie es normalerweise nicht haben würden, damit Sie tel können, ob es ein guter Wert ist oder nicht. Stellen Sie also Ihre Farbe auf -1 ein

Color color = -1;

Oder Sie können Ihre Aufzählung bei 1 beginnen und auf Null setzen. Wenn Sie die Farbe so wie sie ist auf Null setzen, setzen Sie sie auf "Rot", da Rot in Ihrer Aufzählung Null ist.

So,

enum Color {
red =1
blue,
green
}
//red is 1, blue is 2, green is 3
Color mycolour = 0;
Rokujolady
quelle
0

Wäre es nicht besser, der None Konstanten explizit den Wert 0 zuzuweisen ? Warum?

Da der Standardwert enumgleich 0 ist, wird default(Color)er gedruckt , wenn Sie ihn aufrufen würden None.

Da es sich an der ersten Position befindet, würde das Zuweisen des Literalwerts 0 zu einer anderen Konstante dieses Verhalten ändern, und auch das Ändern der Reihenfolge des Auftretens würde die Ausgabe von default(Color)( https://stackoverflow.com/a/4967673/8611327 ) ändern.

sjanisz
quelle
-2
Color? color = null;

oder du kannst verwenden

Color? color = new Color?();

Beispiel, in dem das Zuweisen von Null nicht funktioniert

color = x == 5 ? Color.Red : x == 9 ? Color.Black : null ; 

so können Sie verwenden:

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
TLEJMI
quelle