Jak ustawić wyliczenie na zero

193

Mam wyliczenie

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

Jak ustawić na NULL podczas ładowania.

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

Edytowane: Mój zły, nie wyjaśniłem tego poprawnie. Ale wszystkie odpowiedzi dotyczące nullable są idealne. Moja sytuacja brzmi: co, jeśli mam / ustawiam wyliczenie w klasie z innymi elementami, takimi jak nazwa itp. Podczas ładowania strony inicjalizuję klasę i próbuję ustawić wartości domyślne na null. Oto scenariusz (kod znajduje się w 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; //???
        }
    }

}

Następnie korzystając z poniższych sugestii zmieniłem powyższy kod, aby działał z metodami get i set. Muszę tylko dodać „?” w klasie EnumTest podczas deklaracji prywatnej zmiennej enum oraz w metodzie 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; }
    }

}

Dzięki wszystkim za cudowne sugestie.

Sri Reddy
źródło
Możliwy duplikat C # Enums: Nullable lub „Unknown” Value?
Michael Freidgeim

Odpowiedzi:

373

Możesz użyć „?” operator dla typu zerowalnego.

public Color? myColor = null;

Lub skorzystaj ze standardowej praktyki dla wyliczeń, które nie mogą być zerowe, ponieważ PIERWSZA wartość w wyliczeniu (czyli 0) będzie wartością domyślną. Na przykład w przypadku koloru Brak.

public Color myColor = Color.None;
Rodney S. Foley
źródło
@equiman nie trzeba przesyłać, ponieważ typ jest określony po lewej stronie, w zasadzie duplikujesz pierwszą część mojej odpowiedzi, która jest już zaakceptowana.
Rodney S. Foley
7
to odpowiedziało na moje pytanie: czy możesz dodać „?” na pseudonim, aby uczynić go zerowalnym?
LuckyLikey,
dla tych, którzy już mają zadeklarowany typ zerowy w swojej klasie i przychodzą tutaj: myColor = (Color?) null;
StefanJanssen,
@StefanJanssen nie musisz rzucać wartości null, jeśli jest to już zadeklarowany zerowy typ koloru, tylko myColor = null jest w porządku.
Rodney S. Foley,
Nie wiem, na czym polega problem, ale dla mojego kompilatora dawał błędy, dopóki nie wykonałem obsady.
StefanJanssen
43

Jeśli jest to C #, to nie zadziała: wyliczenia są typami wartości i nie mogą być null.

Normalne opcje to dodanie Noneczłonka:

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

Color color = Color.None;

... lub użyć Nullable:

Color? color = null;
Tim Robinson
źródło
24

Uczyń swoją zmienną zerową. Lubić:

Color? color = null;

lub

Nullable<Color> color = null;
Cj S.
źródło
9

Wyliczenie jest typem „wartości” w języku C # (oznacza, że ​​wyliczenie jest przechowywane jako dowolna wartość, a nie jako odniesienie do miejsca w pamięci, w którym przechowywana jest sama wartość). Nie można ustawić typów wartości na null (ponieważ null jest używany tylko dla typów referencyjnych).

Biorąc to pod uwagę, możesz użyć wbudowanej Nullable<T>klasy, która otacza typy wartości tak, że możesz ustawić je na null, sprawdzić, czy jest HasValueono rzeczywiste Value. (Są to obie metody na Nullable<T>obiektach.

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

Istnieje również skrót, którego możesz użyć:

Color? color = null;

To jest to samo co Nullable<Color>;

Chris Pfohl
źródło
3

Zakładam c ++ tutaj. Jeśli używasz c #, odpowiedź jest prawdopodobnie taka sama, ale składnia będzie nieco inna. Wyliczenie jest zbiorem wartości int. To nie jest obiekt, więc nie powinieneś ustawiać go na zero. Ustawienie wartości na zero oznacza, że ​​wskazujesz obiekt na adres, aby zająć zero. Naprawdę nie możesz tego zrobić z int. To, co chcesz zrobić z int, to ustawić go na wartość, w której normalnie byś go nie miał, abyś mógł tel, jeśli jest to dobra wartość, czy nie. Ustaw kolor na -1

Color color = -1;

Możesz też rozpocząć enum od 1 i ustawić go na zero. Jeśli ustawisz kolor na zero, tak jak jest teraz, ustawisz go na „czerwony”, ponieważ czerwony jest w twoim wyliczeniu zero.

Więc,

enum Color {
red =1
blue,
green
}
//red is 1, blue is 2, green is 3
Color mycolour = 0;
Rokujolady
źródło
0

czy nie byłoby lepiej jawnie przypisać wartość 0 None stałej? Czemu?

Ponieważ enumwartość domyślna jest równa 0, wywołanie default(Color)spowoduje wydrukowanie None.

Ponieważ jest na pierwszej pozycji, przypisanie wartości dosłownej 0 do dowolnej innej stałej zmieniłoby to zachowanie, również zmiana kolejności występowania zmieniłaby wynik default(Color)( https://stackoverflow.com/a/4967673/8611327 )

sjanisz
źródło
-2
Color? color = null;

lub możesz użyć

Color? color = new Color?();

przykład, w którym przypisanie wartości null nie zadziała

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

dzięki czemu możesz użyć:

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
TLEJMI
źródło