Почему С# допускает недопустимое значение перечисления

Я потратил некоторое время, пытаясь понять, почему мое приложение WPF не привязывалось к свойству enum, и это является причиной.

 static void Main(string[] args)
 {
  MyEnum x = 0;
  Console.WriteLine(x.ToString());
  Console.ReadLine();
 }

 public enum MyEnum
 {
  First = 1,
  Second = 2
 }

По существу, проблема заключалась в том, что для свойства enum в конструкторе класса я не было установленное значение по умолчанию, поэтому оно по умолчанию было нулевым.

Можно ли каким-то образом сказать компилятору С#, что я хочу, чтобы он принимал только допустимые значения (и по умолчанию - самое низкое значение)? Я не хочу, чтобы мое свойство принимало недопустимые значения, и я не хочу писать код настройки для каждого свойства, которое использует перечисление.

Ответ 1

Нет, к сожалению, нет.

Перечисления на С# - это просто номера с именами, на самом деле - нет никакой проверки. Я согласен, было бы очень приятно видеть это, а также перечисления с поведением (например, на Java). Я ничего не слышал, чтобы предположить, что это произойдет в ближайшее время: (

Обратите внимание, что значение по умолчанию для типа всегда будет значением, представленным "всеми нулевыми битами" - нет способа обойти это внутри системы типов. Поэтому либо вам нужно сделать это разумным значением по умолчанию, либо вам придется явно протестировать его даже в проверяющей системе (например, тестирование против null для ссылочных типов).

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