Может ли перечисление быть нулевым в C # - PullRequest
0 голосов
/ 08 января 2019

Просто интересно, может ли enum быть нулевым в C #?

В частности, меня интересует реализация HttpStatusCode enum в C #.

Что произойдет, если я не назначу значение переменной HttpStatusCode тип? Что произойдет, если я попытаюсь присвоить значение, которое не ожидается?

Ответы [ 3 ]

0 голосов
/ 08 января 2019

С MSDN :

Каждый тип перечисления имеет базовый тип, который может быть любым целым типом, кроме char. Базовым типом элементов перечисления по умолчанию является int. Чтобы объявить перечисление другого целочисленного типа, например байта, используйте двоеточие после идентификатора, за которым следует тип, как показано в следующем примере. C #

enum Day: byte {Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri};

Допустимые типы для перечисления: байты, байты, короткие, короткие, короткие, целые, длинные или длинные.

Поскольку это только типы значений, само перечисление не может быть null.

Конечно, вы можете обернуть его в Nullable , который позволяет типам значений вести себя как «обнуляемые», но технически Nullable<T> является универсальным структурным типом (ненулевым) и не сам по себе enum это просто обёртка как по определению:

public struct Nullable<T> where T : struct

Вы можете задаться вопросом: как структура может быть null? См. Этот ответ для объяснения :

Nullable<bool> b = new Nullable<bool>();

По сути, это никогда не null. Это хитрость компилятора, чтобы гарантировать, что значения, например, HasValue всегда доступны.

0 голосов
/ 08 января 2019

HttpStatusCodes Enum

В вашем конкретном вопросе о HttpStatusCodes.

На самом деле происходит то, что перечисление «содружественное для чтения кода», такое как StatusCodes.400NotFound, является просто представлением целочисленного значения 400. Вы можете просто вручную использовать целочисленное значение в качестве аргумента, если хотите, но тогда кто-то, кто читает ваш код, может не понимать код состояния HTTP.

Например, если я просто написал в своем коде код состояния 422, легко ли его прочитать / понять? Наверное, не очень хорошая идея. У того, кто читает ваш код, больше шансов, если вы используете StatusCode.422UnprocessableEntity.

Каковы действительные коды состояния HTTP?
Если вы отправляете ответ HTTP, вы можете назначить любое из целочисленных значений, перечисленных здесь ... https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

Неназначенные или поведение по умолчанию?
Не зная, каким методом или каким сервером вы пользуетесь, ваш вопрос о «что произойдет, если он не назначен». Обычный ответ заключается в том, что сервер ответит кодом состояния 200 (ОК) по умолчанию.

Использование нестандартных кодов ответа
Это действительно зависит от того, что вы делаете, но использование значений кода ответа, которые не являются частью стандарта (например, -999), может (или не может) привести к ошибке, но вам следует избегать этого, поскольку это не поддерживаемый стандарт.

Nullable Enum

Для HttpStatusCodes во всех случаях (я когда-либо сталкивался) вы не можете присвоить null значение HttpResponse, так как тип свойства целочисленный.

Обратите внимание, что то, что я говорю, относится к назначению значения кода состояния для объекта HttpResponse. Вы можете прочитать другие ответы о типичном вопросе nullable перечислений.

0 голосов
/ 08 января 2019

Нет, если вы не сделаете свою переменную типа Nullable<MyEnum> (или MyEnum?).

Под капотом перечисления являются целыми числами. Когда перечисление неинициализировано, оно имеет значение default(int), равное 0.

Редактировать: возможны другие базовые типы, но по умолчанию используется int. Какой бы базовый тип вы не использовали, неинициализированное перечисление всегда будет значением по умолчанию для базового типа.

Если вы не назначаете целочисленные значения для вашего перечисления, первая опция будет установлена ​​на 0 и, следовательно, будет использоваться по умолчанию.

public enum MyEnum { Foo, Bar, Baz }

MyEnum myEnum;

if(myEnum == MyEnum.Foo) //true 
if(myEnum == MyEnum.Bar) //false
if(myEnum == MyEnum.Baz) //false

Если вы присваиваете enum целочисленные значения, а значение 0 (или неназначенное) отсутствует, то ваше неинициализированное перечисление не будет соответствовать ни одному из параметров.

public enum MyEnum { Foo = 1, Bar = 2, Baz = 3 }

MyEnum myEnum;

if(myEnum == MyEnum.Foo) //false
if(myEnum == MyEnum.Bar) //false
if(myEnum == MyEnum.Baz) //false
...