Convertir un número fuera de rango a una enumeración en C # no produce una excepción

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

  •  03-07-2019
  •  | 
  •  

Pregunta

El siguiente código no produce una excepción, sino que pasa el valor 4 a tst. ¿Alguien puede explicar la razón detrás de esto?

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

testing tst = (testing)(4);
¿Fue útil?

Solución

En C #, a diferencia de Java, las enumeraciones no se verifican. Puede tener cualquier valor del tipo subyacente. Es por esto que es muy importante revisar su entrada.

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

Otros consejos

Dado que su enumeración se basa en int, puede aceptar cualquier valor que int pueda. Y como le está diciendo al compilador explícitamente (lanzando) que está bien lanzar 4 en su enumeración, lo hace.

Cada enumeración tiene un tipo numérico subyacente (por ejemplo, int) que se utiliza para la representación. Incluso si un valor no tiene un nombre, es un valor posible que puede tener la enumeración.

Lo que otros no dijeron: Con el casting, le dices al compilador que sabes lo que estás haciendo. Entonces, si lo dices, trata esto como un valor enumerable, lo hace. Los otros carteles señalaron por qué esto todavía está permitido, ya que el compilador de C # no permite muchas cosas malas, incluso si dices que sabes lo que estás haciendo.

Sería realmente malo si no se permitiera el valor, porque entonces no podría guardar un valor de marca como un int. O bien, alguien tuvo que comprobar si el int es una de las combinaciones permitidas, lo que puede ser mucho si utiliza una enumeración de bandera (con valores que pueden unirse o combinarse).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top