Come impostare enum su null


194

Ho un enum

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

Come impostarlo su NULL al caricamento.

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

Modificato: Mio male, non l'ho spiegato bene. Ma tutte le risposte relative a nullable sono perfette. La mia situazione è What if, ho get / set per l'enum in una classe con altri elementi come il nome, ecc. Al caricamento della pagina inizializzo la classe e provo a impostare i valori su null. Ecco lo scenario (il codice è 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; //???
        }
    }

}

Quindi usando i suggerimenti di seguito ho modificato il codice sopra per farlo funzionare con i metodi get e set. Devo solo aggiungere "?" nella classe EnumTest durante la dichiarazione della variabile enum privata e nel metodo get / set:

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

}

Grazie a tutti per i preziosi suggerimenti.


Risposte:


374

Puoi usare il "?" operatore per un tipo nullable.

public Color? myColor = null;

Oppure usa la pratica standard per gli enum che non possono essere nulli avendo il PRIMO valore nell'enum (aka 0) come valore predefinito. Ad esempio in un caso di colore Nessuno.

public Color myColor = Color.None;

@equiman non è necessario eseguire il cast poiché il tipo è specificato a sinistra, stai praticamente duplicando la prima parte della mia risposta che è già stata accettata.
Rodney S. Foley,

7
questo ha risposto alla mia domanda: puoi aggiungere "?" enumname per renderlo nullable?
LuckyLikey,

per coloro che hanno già dichiarato il tipo nullable nella loro classe e vengono qui: myColor = (Color?) null;
StefanJanssen,

@StefanJanssen non è necessario eseguire il cast del null se è già un tipo di colore dichiarabile nullable solo myColor = null va bene.
Rodney S. Foley,

Non so quale sia il problema allora, ma per il mio compilatore ha dato errori fino a quando non ho fatto il cast.
StefanJanssen,

43

Se questo è C #, non funzionerà: gli enum sono tipi di valore e non possono esserlo null.

Le normali opzioni sono di aggiungere un Nonemembro:

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

Color color = Color.None;

... o per usare Nullable:

Color? color = null;

24

Rendi la tua variabile nullable. Piace:

Color? color = null;

o

Nullable<Color> color = null;

9

Un enum è un tipo di "valore" in C # (significa che l'enum è memorizzato come qualunque valore sia, non come riferimento a un posto nella memoria in cui è memorizzato il valore stesso). Non è possibile impostare i tipi di valore su null (poiché null viene utilizzato solo per i tipi di riferimento).

Detto questo, puoi usare la Nullable<T>classe incorporata che avvolge i tipi di valore in modo tale da poterli impostare su null, verificarne se HasValuee ottenerne l'effettivo Value. (Questi sono entrambi metodi sugli Nullable<T>oggetti.

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

C'è anche una scorciatoia che puoi usare:

Color? color = null;

Questo è lo stesso di Nullable<Color>;


3

Sto assumendo c ++ qui. Se stai usando c #, la risposta è probabilmente la stessa, ma la sintassi sarà leggermente diversa. L'enum è un insieme di valori int. Non è un oggetto, quindi non dovresti impostarlo su null. Impostare qualcosa su null significa che stai puntando un puntatore a un oggetto per indirizzare zero. Non puoi davvero farlo con un int. Quello che vuoi fare con un int è impostarlo su un valore che normalmente non avresti in modo da poter tel se è un buon valore o no. Quindi, imposta il colore su -1

Color color = -1;

In alternativa, puoi iniziare l'enum da 1 e impostarlo su zero. Se imposti il ​​colore su zero com'è adesso, lo imposterai su "rosso" perché il rosso è zero nel tuo enum.

Così,

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

0

non sarebbe meglio assegnare esplicitamente il valore 0 alla None costante? Perché?

Poiché il enumvalore predefinito è uguale a 0, se lo chiamassi default(Color), verrebbe stampato None.

Poiché è nella prima posizione, l'assegnazione del valore letterale 0 a qualsiasi altra costante cambierebbe tale comportamento, inoltre cambiando l'ordine di occorrenza cambierebbe l'output di default(Color)( https://stackoverflow.com/a/4967673/8611327 )


-2
Color? color = null;

oppure puoi usare

Color? color = new Color?();

esempio in cui l'assegnazione di null non funzionerà

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

così puoi usare:

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.