В отсутствие члена по умолчанию, я думаю, что полезно иметь значение, представляющее литерал int 0.
Независимо от того, что заданное перечисление будет создано с буквальным значением 0. Наиболее простой случай здесь - это член структуры. Структура C # всегда будет иметь пустой конструктор по умолчанию, который инициализирует все поля до значения по умолчанию. В случае перечисления это будет буквальное значение 0. Вопрос в том, как с этим справиться.
Для меня это вопрос стиля: если перечисление явно не инициализируется значением, должно ли оно быть произвольным допустимым значением или конкретным значением, указывающим на отсутствие явной инициализации?
enum Color { Unknown, Red, Blue }
enum Color2 { Red,Blue }
struct Example<T> {
Color color;
}
static void SomeMethod() {
var v1 = new Example<Color>();
var v2 = new Example<Color2>();
}
В случае v1, если поле цвета проверено, оно будет явно помечено как неинициализированное поле. В v2 поле будет просто «Красным». Программист не может обнаружить между и явным значением «Red» или неявным значением по умолчанию «Red».
Другим случаем, когда это вызывает проблему, является выполнение оператора switch для значения enum. Давайте немного изменим определение Color2.
enum Color2 { Red = 1, Blue = 2 }
static void SomeOtherMethod(p1 as Example<Color2>) {
switch ( p1.color ) {
case Color.Red: {}
case Color.Blue: {}
default: {throw new Exception("What happened?"); }
}
}
Переключатель обрабатывает каждое явное значение в перечислении. Тем не менее, этот код не будет работать для конструктора по умолчанию в Example , и нет способа подавить этот конструктор.
Это приводит к чуть более важному правилу: иметь явное значение перечисления для литерального значения 0.