enum (Referencia de C#)enum (C# Reference)

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.The enum keyword is used to declare an enumeration, a distinct type that consists of a set of named constants called the enumerator list.

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 esta con la misma facilidad.Usually it is best to define an enum directly within a namespace so that all classes in the namespace can access it with equal convenience. Sin embargo, una enumeración también puede anidarse dentro de una clase o estructura.However, an enum can also be nested within a class or struct.

De manera predeterminada, el primer enumerador tiene el valor 0 y el valor de cada enumerador sucesivo se incrementa en 1.By default, the first enumerator has the value 0, and the value of each successive enumerator is increased by 1. Por ejemplo, en la siguiente enumeración, Sat es 0, Sun es 1, Mon es 2, y así sucesivamente.For example, in the following enumeration, Sat is 0, Sun is 1, Mon is 2, and so forth.

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

Los enumeradores pueden usar inicializadores para invalidar los valores predeterminados, como se muestra en el ejemplo siguiente.Enumerators can use initializers to override the default values, as shown in the following example.

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

En esta enumeración, la secuencia de elementos debe iniciarse a partir de 1 en lugar de 0.In this enumeration, the sequence of elements is forced to start from 1 instead of 0. Sin embargo, se recomienda incluir una constante con el valor 0.However, including a constant that has the value of 0 is recommended. Para obtener más información, vea Tipos de enumeración.For more information, see Enumeration Types.

Cada tipo de enumeración tiene un tipo subyacente, que puede ser cualquier tipo numérico entero.Every enumeration type has an underlying type, which can be any integral numeric type. El tipo char no puede ser un tipo subyacente de una enumeración.The char type cannot be an underlying type of an enum. El tipo subyacente predeterminado de los elementos de la enumeración es int. Para declarar una enumeración de otro tipo entero, como byte, use el carácter de dos puntos después del identificador y escriba a continuación el tipo, como se muestra en el ejemplo siguiente.The default underlying type of enumeration elements is int. To declare an enum of another integral type, such as byte, use a colon after the identifier followed by the type, as shown in the following example.

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

A una variable de un tipo de enumeración se le puede asignar cualquier valor en el intervalo del tipo subyacente; los valores no se limitan a las constantes con nombre.A variable of an enumeration type can be assigned any value in the range of the underlying type; the values are not limited to the named constants.

El valor predeterminado de enum E es el valor que produce la expresión (E)0.The default value of an enum E is the value produced by the expression (E)0.

Nota

Un enumerador no puede contener espacios en blanco en su nombre.An enumerator cannot contain white space in its name.

El tipo subyacente especifica la cantidad de almacenamiento asignado a cada enumerador.The underlying type specifies how much storage is allocated for each enumerator. No obstante, se necesita una conversión explícita para convertir un tipo enum a un tipo entero.However, an explicit cast is necessary to convert from enum type to an integral type. 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.For example, the following statement assigns the enumerator Sun to a variable of the type int by using a cast to convert from enum to int.

int x = (int)Day.Sun;

Cuando se aplica System.FlagsAttribute a una enumeración que contiene algunos elementos que se pueden combinar con una operación OR bit a bit, se observará que el atributo afecta al comportamiento de enum cuando se utiliza con algunas herramientas.When you apply System.FlagsAttribute to an enumeration that contains elements that can be combined with a bitwise OR operation, the attribute affects the behavior of the enum when it is used with some tools. Se pueden observar estos cambios al utilizar herramientas tales como los métodos de la clase Console y el Evaluador de expresiones.You can notice these changes when you use tools such as the Console class methods and the Expression Evaluator. (Vea el tercer ejemplo.)(See the third example.)

Programación sólidaRobust programming

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.Just as with any constant, all references to the individual values of an enum are converted to numeric literals at compile time. Esto puede crear posibles problemas de versiones como se describe en Constantes.This can create potential versioning issues as described in Constants.

La asignación de valores adicionales a nuevas versiones de enumeraciones o el cambio de los valores de los miembros de enumeración en una nueva versión puede producir problemas para el código fuente dependiente.Assigning additional values to new versions of enums, or changing the values of the enum members in a new version, can cause problems for dependent source code. Los valores enum se utilizan a menudo en instrucciones switch .Enum values often are used in switch statements. Si los elementos adicionales se han agregado al tipo enum , la sección predeterminada de la instrucción switch se puede seleccionar de forma inesperada.If additional elements have been added to the enum type, the default section of the switch statement can be selected unexpectedly.

Si otros desarrolladores utilizan 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 .If other developers use your code, you should provide guidelines about how their code should react if new elements are added to any enum types.

EjemploExample

En el ejemplo siguiente, se declara una enumeración, Day.In the following example, an enumeration, Day, is declared. Dos enumeradores se convierten explícitamente en un número entero y se asignan a variables de número entero.Two enumerators are explicitly converted to integer and assigned to integer variables.

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

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

EjemploExample

En el ejemplo siguiente, la opción de tipo base se utiliza para declarar un enum cuyos miembros son del tipo long.In the following example, the base-type option is used to declare an enum whose members are of type 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.Notice that even though the underlying type of the enumeration is long, the enumeration members still must be explicitly converted to type long by using a cast.

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
*/

EjemploExample

En el ejemplo de código siguiente se ilustra el uso y efecto del atributo System.FlagsAttribute en una declaración enum .The following code example illustrates the use and effect of the System.FlagsAttribute attribute on an enum declaration.

// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
    // The flag for SunRoof is 0001.
    SunRoof = 0x01,
    // The flag for Spoiler is 0010.
    Spoiler = 0x02,
    // The flag for FogLights is 0100.
    FogLights = 0x04,
    // The flag for TintedWindows is 1000.
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        // The bitwise OR of 0001 and 0100 is 0101.
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;

        // Because the Flags attribute is specified, Console.WriteLine displays
        // the name of each enum element that corresponds to a flag that has
        // the value 1 in variable options.
        Console.WriteLine(options);
        // The integer value of 0101 is 5.
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

ComentariosComments

Si quita Flags, el ejemplo muestra los siguientes valores:If you remove Flags, the example displays the following values:

5

5

Especificación del lenguaje C#C# language specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also