Преобразование числа вне диапазона в перечисление в C # не приводит к исключению

StackOverflow https://stackoverflow.com/questions/618305

  •  03-07-2019
  •  | 
  •  

Вопрос

Следующий код не создает исключение, а вместо этого передает значение 4 в tst. Кто-нибудь может объяснить причину этого?

 public enum testing
 { 
    a = 1,
    b = 2,
    c = 3
 }

testing tst = (testing)(4);
Это было полезно?

Решение

В C #, в отличие от Java, перечисления не проверяются. Вы можете иметь любое значение базового типа. Вот почему очень важно проверить ваш вклад.

if(!Enum.IsDefined(typeof(MyEnum), value))
     throw new ArgumentOutOfRangeException();

Другие советы

Поскольку ваше перечисление основано на int, оно может принимать любое значение, которое может использовать int. И так как вы явно указываете компилятору (путем приведения), что можно привести 4 в ваше перечисление, это так.

Каждое перечисление имеет базовый числовой тип (например, int), который используется для представления. Даже если у значения нет имени, это возможное значение, которое может иметь перечисление.

Чего не говорили другие: с помощью кастинга вы сообщаете компилятору, что знаете, что делаете. Так что, если вы скажете это, обработайте это как значение перечисления, это так. Другие авторы указали, почему это все еще разрешено, поскольку компилятор C # не допускает много плохих вещей, даже если вы говорите, что знаете, что делаете.

Было бы очень плохо, если бы значение не было разрешено, потому что тогда вы не можете сохранить значение флага как int. Или кто-то должен был проверить, является ли int одной из разрешенных комбинаций, что может быть много, если вы используете перечисление флага (со значениями, которые можно объединять или объединять).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top