Как установить enum в null

194

У меня есть перечисление

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

Как установить его в NULL при загрузке.

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

Отредактировано: мой плохой, я не объяснил это должным образом. Но все ответы, связанные с nullable, идеальны. Моя ситуация: что, если у меня есть get / set для перечисления в классе с другими элементами, такими как name и т. Д. При загрузке страницы я инициализирую класс и пытаюсь установить значения по умолчанию в null. Вот сценарий (код на 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; }
    }

}

Спасибо всем за прекрасные предложения.

Шри Редди
источник
Возможная копия C # Enums: Nullable или 'Unknown' Value?
Майкл Фрейдгейм

Ответы:

374

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

public Color? myColor = null;

Или используйте стандартную практику для перечислений, которые не могут быть нулевыми, если значение FIRST в перечислении (aka 0) будет значением по умолчанию. Например, в случае цвета Нет.

public Color myColor = Color.None;
Родни С. Фоли
источник
@equiman не нужно приводить, так как тип указан слева, вы дублируете первую часть моего ответа, которая уже принята.
Родни С. Фоли,
7
это ответило на мой вопрос: вы можете добавить '?' в enumname, чтобы сделать его обнуляемым?
LuckyLikey
для тех, у кого уже есть тип nullable, объявленный в их классе и приходящий сюда: myColor = (Color?) null;
StefanJanssen
@StefanJanssen вам не нужно приводить значение NULL, если его уже объявленный тип Nullable для 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;
Cj S.
источник
9

Перечисление является типом «значение» в C # (означает, что перечисление хранится как любое значение, а не как ссылка на место в памяти, где хранится само значение). Вы не можете установить типы значений в null (поскольку null используется только для ссылочных типов).

При этом вы можете использовать встроенный Nullable<T>класс, который оборачивает типы значений так, что вы можете установить для них значение null, проверить его HasValueи получить его фактический Value. (Это оба метода на Nullable<T>объектах.

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

Существует также ярлык, который вы можете использовать:

Color? color = null;

Это так же, как Nullable<Color>;

Крис Пфол
источник
3

Я предполагаю, что C ++ здесь. Если вы используете c #, ответ, вероятно, тот же, но синтаксис будет немного другим. Перечисление представляет собой набор значений int. Это не объект, поэтому вы не должны устанавливать его на ноль. Установка чего-либо в null означает, что вы указываете указатель на объект с нулевым адресом. Вы не можете сделать это с помощью int. Что вы хотите сделать с int, так это установить для него значение, на которое вы обычно не имеете его, чтобы вы могли узнать, хорошее это значение или нет. Итак, установите цвет -1

Color color = -1;

Или вы можете начать свой enum с 1 и установить его на ноль. Если вы установите цвет на ноль, как сейчас, вы установите его на «красный», потому что красный в вашем перечислении равен нулю.

Так,

enum Color {
red =1
blue,
green
}
//red is 1, blue is 2, green is 3
Color mycolour = 0;
Rokujolady
источник
0

не лучше ли явно присвоить значение 0 None константе? Зачем?

Потому что enumзначение по умолчанию равно 0, если бы Вы позвонили, default(Color)это напечатало бы None.

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

sjanisz
источник
-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?(); 
TLEJMI
источник