Подтвердить что ты не робот

Выделение числа вне диапазона для перечисления в С# не создает исключения

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

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

testing tst = (testing)(4);
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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