У меня есть перечисление
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; }
}
}
Спасибо всем за прекрасные предложения.
Ответы:
Вы можете использовать "?" оператор для обнуляемого типа.
Или используйте стандартную практику для перечислений, которые не могут быть нулевыми, если значение FIRST в перечислении (aka 0) будет значением по умолчанию. Например, в случае цвета Нет.
источник
Если это C #, он не будет работать: перечисления являются типами значений и не могут быть
null
.Обычные варианты - добавить
None
участника:... или использовать
Nullable
:источник
Сделайте вашу переменную обнуляемой. Подобно:
или
источник
Перечисление является типом «значение» в C # (означает, что перечисление хранится как любое значение, а не как ссылка на место в памяти, где хранится само значение). Вы не можете установить типы значений в null (поскольку null используется только для ссылочных типов).
При этом вы можете использовать встроенный
Nullable<T>
класс, который оборачивает типы значений так, что вы можете установить для них значение null, проверить егоHasValue
и получить его фактическийValue
. (Это оба метода наNullable<T>
объектах.Существует также ярлык, который вы можете использовать:
Это так же, как
Nullable<Color>
;источник
Я предполагаю, что C ++ здесь. Если вы используете c #, ответ, вероятно, тот же, но синтаксис будет немного другим. Перечисление представляет собой набор значений int. Это не объект, поэтому вы не должны устанавливать его на ноль. Установка чего-либо в null означает, что вы указываете указатель на объект с нулевым адресом. Вы не можете сделать это с помощью int. Что вы хотите сделать с int, так это установить для него значение, на которое вы обычно не имеете его, чтобы вы могли узнать, хорошее это значение или нет. Итак, установите цвет -1
Или вы можете начать свой enum с 1 и установить его на ноль. Если вы установите цвет на ноль, как сейчас, вы установите его на «красный», потому что красный в вашем перечислении равен нулю.
Так,
источник
Потому что
enum
значение по умолчанию равно 0, если бы Вы позвонили,default(Color)
это напечатало быNone
.Поскольку это первая позиция, присвоение литерального значения 0 любой другой константе изменило бы это поведение, а также изменение порядка вхождения изменило бы выходные данные
default(Color)
( https://stackoverflow.com/a/4967673/8611327 )источник
или вы можете использовать
пример, где назначение нуля не будет работать
так что вы можете использовать:
источник