enum (Referencia de C#)

Actualización: noviembre 2007

La palabra clave enum se utiliza para declarar una enumeración, un tipo distinto que consiste en un conjunto de constantes con nombre denominado lista de enumeradores.

Normalmente suele ser recomendable definir una enumeración directamente dentro de un espacio de nombres para que todas las clases de dicho espacio puedan tener acceso a ésta con la misma facilidad. Sin embargo, una enumeración también puede anidarse dentro de una clase o estructura.

De forma predeterminada, el primer enumerador tiene el valor 0 y el valor de cada enumerador sucesivo se incrementa en 1. Por ejemplo:

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

En esta enumeración, Sat es 0, Sun es 1, Mon es 2 y así sucesivamente. Los enumeradores pueden tener inicializadores que reemplazan a los valores predeterminados. Por ejemplo:

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

En esta enumeración, se obliga a que la secuencia de elementos empiece en 1 en vez de en 0. Sin embargo, se recomienda que una enumeración contenga una constante con un valor de 0. Para obtener más información, vea Tipos de enumeración (Guía de programación de C#).

Cada tipo de enumeración tiene un tipo subyacente, que puede ser cualquier tipo integral excepto char. El tipo predeterminado subyacente de los elementos de la enumeración es int. Para declarar una enumeración de otro tipo integral, como byte, use un carácter de dos puntos después del identificador y escriba a continuación el tipo:

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

Los tipos admitidos para una enumeración son byte, sbyte, short, ushort, int, uint, long o ulong.

A una variable de tipo Days se le puede asignar cualquier valor en el intervalo del tipo subyacente; los valores no se limitan a las constantes con nombre.

El valor predeterminado de un elemento enum E es el valor producido por la expresión (E)0.

Nota:

Un enumerador no puede contener espacio en blanco en su nombre.

El tipo subyacente especifica el almacenamiento asignado para cada enumerador. No obstante, se necesita una conversión explícita para convertir un tipo enum a un tipo integral. Por ejemplo, la siguiente instrucción asigna el enumerador Sun a una variable de tipo int utilizando una conversión de tipos para convertir de enum a int:

int x = (int)Days.Sun;

Cuando se aplica System.FlagsAttribute a una enumeración que contiene algunos elementos combinados con una operación OR bit a bit, se observará que el atributo afecta al comportamiento de enum cuando se utiliza con algunas herramientas. Se pueden observar estos cambios al utilizar herramientas tales como los métodos de la clase Console, el Evaluador de expresiones, etc. (Vea el ejemplo 3).

Programación sólida

Como ocurre con cualquier constante, todas las referencias a los valores individuales de una enumeración se convierten en literales numéricos en tiempo de compilación. Esto puede crear posibles problemas de versiones como se describe en Constantes (Guía de programación de C#).

Asignar valores adicionales a nuevas versiones de enumeraciones o cambiar los valores de los miembros de enumeración en una nueva versión puede producir problemas para el código fuente dependiente. Los valores enum se utilizan a menudo en instrucciones switch. Si se han agregado elementos adicionales al tipo enum, la comprobación de los valores predeterminados puede devolver true de forma inesperada.

Si otros desarrolladores van a utilizar su código, debería proporcionar instrucciones sobre cómo debería reaccionar el código de ellos al agregar nuevos elementos a cualquier tipo enum.

Ejemplo

En este ejemplo, se declara la enumeración Days. Dos enumeradores se convierten explícitamente en un número entero y se asignan a variables de número entero.

public class EnumTest
{
    enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

    static void Main()
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}
/* Output:
   Sun = 0
   Fri = 5
*/

En este ejemplo, la opción de tipo base se utiliza para declarar un enum cuyos miembros son del tipo long. Observe que a pesar de que el tipo subyacente de la enumeración es long, los miembros de la enumeración todavía deben convertirse explícitamente al tipo long mediante una conversión de tipos.

public class EnumTest2
{
    enum Range : long { Max = 2147483648L, Min = 255L };
    static void Main()
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}
/* Output:
   Max = 2147483648
   Min = 255
*/

El ejemplo de código siguiente ilustra el uso y efecto del atributo System.FlagsAttribute en una declaración enum.

[Flags]
public enum CarOptions
{
    SunRoof = 0x01,
    Spoiler = 0x02,
    FogLights = 0x04,
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
        Console.WriteLine(options);
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

Comentarios

Observe que si quita FlagsAttribute, el ejemplo generará lo siguiente:

5

5

Especificación del lenguaje C#

Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.

  • 1.10 Enumeraciones

  • 6.2.2 Conversiones explícitas de enumeración

  • 14 Enumeraciones

Vea también

Tareas

Ejemplo de atributos

Conceptos

Tipos de enumeración (Guía de programación de C#)

Diseño de enumeraciones

Referencia

Palabras clave de C#

Tabla de tipos integrales (Guía de programación de C#)

Tabla de tipos integrados (Referencia de C#)

Tabla de conversiones numéricas implícitas (Referencia de C#)

Tabla de conversiones numéricas explícitas (Referencia de C#)

Otros recursos

Referencia de C#