Як встановити enum до нуля


193

У мене є перерахунок

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

Як встановити його на NULL при навантаженні.

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

Редаговано: Моє погано, я не пояснив це належним чином. Але всі відповіді, пов’язані з нульовим, ідеальні. Моя ситуація: що якщо, я отримую / встановлюю для перерахунку в класі з іншими елементами, такими як ім'я та ін. Ось сценарій (код знаходиться в 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; //???
        }
    }

}

Тоді, скориставшись наведеними нижче пропозиціями, я змінив вищевказаний код, щоб він працював із методами get і set. Мені просто потрібно додати "?" в класі EnumTest під час декларування приватної змінної enum та методу 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; }
    }

}

Дякую всім за прекрасні пропозиції.


Відповіді:


373

Ви можете використовувати "?" оператор для нульового типу.

public Color? myColor = null;

Або використовуйте стандартну практику для переліків, які не можуть бути нульовими, якщо значення FIRST у enum (aka 0) є значенням за замовчуванням. Наприклад, у випадку з кольором None.

public Color myColor = Color.None;

@equiman не потрібно подавати, оскільки тип вказано зліва, ви в основному дублюєте першу частину моєї відповіді, яка вже прийнята.
Родні С. Фолі

7
це відповіло на моє запитання: чи можете ви додати "?" переписувати, щоб зробити його незмінним?
LuckyLikey

для тих, у кого вже вказано нульовий тип у своєму класі та приходять сюди: myColor = (Color?) null;
StefanJanssen

@StefanJanssen вам не потрібно ставити нуль, якщо його вже оголошений нульовий тип Color просто myColor = null добре.
Родні С. Фолі

Я не знаю, у чому тоді проблема, але для мого компілятора він робив помилки, поки я не зробив актерський склад.
StefanJanssen

43

Якщо це C #, воно не спрацює: перерахунки - це значення, які не можуть бути null .

Нормальні варіанти - додати Noneучасника:

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

Color color = Color.None;

... або використовувати Nullable:

Color? color = null;

24

Зробіть свою змінну нульовою. Подібно до:

Color? color = null;

або

Nullable<Color> color = null;

9

Enum - це тип "значення" в C # (означає, що enum зберігається як би не було значення, а не як посилання на місце в пам'яті, де зберігається саме значення). Ви не можете встановити типи значень null (оскільки null використовується лише для типів посилань).

Якщо говорити, ви можете використовувати вбудований Nullable<T>клас, який обгортає типи значень так, що ви можете встановити їх на нуль, перевірити, чи він HasValueдійсний і отримати його дійсне Value. (Це обидва методи на Nullable<T>об'єктах.

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

Також є ярлик, яким ви можете скористатися:

Color? color = null;

Це те саме, що Nullable<Color>;


3

Я припускаю, що тут c ++. Якщо ви використовуєте c #, відповідь, ймовірно, однаковий, але синтаксис буде дещо іншим. Перерахунок - це набір значень int. Це не об’єкт, тому не слід встановлювати його на нуль. Якщо щось встановити на нуль, ви означаєте, що ви вказуєте вказівник на об'єкт, який відповідає нулю. Ти не можеш реально зробити це з int. Те, що ви хочете зробити з int, - це встановити його на значення, яке ви зазвичай не мали б, щоб ви могли говорити, чи це хороша цінність чи ні. Отже, встановіть свій колір на -1

Color color = -1;

Або ви можете запустити перерахунок на 1 і встановити його в нуль. Якщо ви встановите колір як нуль, як зараз, ви встановите його на "червоний", оскільки червоний дорівнює нулю.

Так,

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

0

не було б краще явно призначити значення 0 None постійному? Чому?

Оскільки enumзначення за замовчуванням дорівнює 0, якщо ви б назвали default(Color)його, воно надрукувало б None.

Оскільки це на першому положенні, присвоєння буквального значення 0 будь-якій іншій константі змінило б цю поведінку, а також зміна порядку виникнення змінила б вихід default(Color)( https://stackoverflow.com/a/4967673/8611327 )


-2
Color? color = null;

або ви можете використовувати

Color? color = new Color?();

Приклад, коли присвоєння нульової роботи не буде

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

тож ви можете використовувати:

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.