tipos sirven representan racionales que para numeros naturales los enteros como c# enums

c# - sirven - ¿Las enumeraciones solo se llaman enteros, tipos o ninguno de los dos?



para que sirven los numeros enteros (3)

Diversión con enumeraciones en C #. Tome una lista genérica que se crea para almacenar algunos Enum que había definido previamente y agregue algunos elementos en él. Itera con foreach o GetEnumerator<T>() pero especifique alguna otra enumeración, luego la original y vea qué sucede. Esperaba InvalidCastException o algo así, pero funciona perfectamente :).

Para la ilustración, tomemos una aplicación de consola simple y creemos dos enumeraciones allí: Cars y Animals:

public enum Cars { Honda = 0, Toyota = 1, Chevrolet = 2 } public enum Animals { Dog = 0, Cat = 1, Tiger = 2 }

Y haz esto en el método principal:

public static void Main() { List<Cars> cars = new List<Cars>(); List<Animals> animals = new List<Animals>(); cars.Add(Cars.Chevrolet); cars.Add(Cars.Honda); cars.Add(Cars.Toyota); foreach (Animals isItACar in cars) { Console.WriteLine(isItACar.ToString()); } Console.ReadLine(); }

Imprimirá esto en la consola:

Tiger Dog Cat

¿Por qué está pasando esto? Mi primera suposición fue que enum no es realmente un Type por sí mismo, es solo e int, pero eso no es cierto: si escribimos:

Console.WriteLine(Animals.Tiger.GetType().FullName); ¡Obtendremos su nombre completamente calificado impreso! ¿Entonces por qué esto?


Conceptualmente, un Enum es un valor tipado estáticamente con una representación de cadena y un número. Cuando llama a ToString() en una enumeración, devolverá la representación de cadena. Cuando llame a GetType() en una enumeración, obtendrá el tipo de enumeración estática. Si lanzas una enumeración a int , obtendrás el valor entero para la enumeración.

Se supone que los enumeradores tienen caracteres fuertes, pero hay algunas cosas que debes tener en cuenta, como el hecho de que cualquier entero se puede convertir a cualquier enumeración incluso si no tiene una declaración correspondiente (en cuyo caso la representación de la cadena ser el mismo que el número)

En el CLR, las enumeraciones (como bool s) simplemente se tratan como int , pero si llama a GetType () o GetString () llama a las versiones que hacen lo que se describió anteriormente.


Los tipos de Enum son distintos, pero uno está confundido por un elenco implícito que está en foreach.

Vamos a reescribir tu bucle un poco:

public static void Main() { List<Cars> cars = new List<Cars>(); List<Animals> animals = new List<Animals>(); cars.Add(Cars.Chevrolet); cars.Add(Cars.Honda); cars.Add(Cars.Toyota); foreach (Cars value in cars) { // This time the cast is explicit. Animals isItACar = (Animals) value; Console.WriteLine(isItACar.ToString()); } Console.ReadLine(); }

Ahora te sorprende el resultado? Con suerte no, excepto posiblemente el hecho de que puedes transmitir de una enumeración a otra. Esta es solo una versión más explícita de lo que está haciendo su código original.

El hecho de que haya un elenco implícito en cada ciclo foreach (aunque normalmente es un no-op) es el bit que la mayoría de los desarrolladores considerarían confuso, creo.

De la sección 8.8.4 de la especificación C # 3.0:

Los pasos anteriores, si tienen éxito, producen inequívocamente un tipo de recopilación C, un enumerador tipo E y un elemento tipo T. Una declaración foreach de la forma

foreach (V v in x) embedded-statement

luego se expande a:

{ E e = ((C)(x)).GetEnumerator(); try { V v; while (e.MoveNext()) { v = (V)(T)e.Current; embedded-statement } } finally { ... // Dispose e } }

La conversión de enumeración se cubre en la sección 6.2.2:

Las conversiones de enumeración explícita son:

  • Desde sbyte, byte, short, ushort, int, uint, long, ulong, char, float, doble o decimal a cualquier tipo de enumeración.
  • Desde cualquier tipo de enum hasta sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double o decimal.
  • Desde cualquier tipo de enumeración a cualquier otro tipo de enumeración.

Una conversión de enumeración explícita entre dos tipos se procesa tratando cualquier tipo de enumeración participante como el tipo subyacente de ese tipo de enumeración, y luego realizando una conversión numérica implícita o explícita entre los tipos resultantes. Por ejemplo, dado un tipo enum E con y tipo subyacente de int, una conversión de E a byte se procesa como una conversión numérica explícita (§6.2.1) de int a byte, y una conversión de byte a E se procesa como una conversión numérica implícita (§6.1.2) de byte a int.


También puede derivar una enumeración de un tipo específico.

public enum Cats : byte { ... } public enum Dogs : int { ... }