EnumeracionesEnums

Un tipo de enumeración es un tipo de valor distinto (tipos de valor) que declara un conjunto de constantes con nombre.An enum type is a distinct value type (Value types) that declares a set of named constants.

El ejemploThe example

enum Color
{
    Red,
    Green,
    Blue
}

declara un tipo de enumeración denominado Color con miembros Red, Green y Blue.declares an enum type named Color with members Red, Green, and Blue.

Declaraciones de enumeraciónEnum declarations

Una declaración de enumeración declara un nuevo tipo de enumeración.An enum declaration declares a new enum type. Una declaración de enumeración comienza con la palabra clave enum, y define el nombre, la accesibilidad, el tipo subyacente y los miembros de la enumeración.An enum declaration begins with the keyword enum, and defines the name, accessibility, underlying type, and members of the enum.

enum_declaration
    : attributes? enum_modifier* 'enum' identifier enum_base? enum_body ';'?
    ;

enum_base
    : ':' integral_type
    ;

enum_body
    : '{' enum_member_declarations? '}'
    | '{' enum_member_declarations ',' '}'
    ;

Cada tipo de enumeración tiene un tipo entero correspondiente denominado el tipo subyacente del tipo de enumeración.Each enum type has a corresponding integral type called the underlying type of the enum type. Este tipo subyacente debe ser capaz de representar todos los valores de enumerador definidos en la enumeración.This underlying type must be able to represent all the enumerator values defined in the enumeration. Una declaración de enumeración puede declarar explícitamente un tipo subyacente de byte, sbyte, short, ushort, int, uint, long o ulong.An enum declaration may explicitly declare an underlying type of byte, sbyte, short, ushort, int, uint, long or ulong. Tenga en cuenta que char no se puede usar como un tipo subyacente.Note that char cannot be used as an underlying type. Una declaración de enumeración que no declara explícitamente un tipo subyacente tiene un tipo subyacente de int.An enum declaration that does not explicitly declare an underlying type has an underlying type of int.

El ejemploThe example

enum Color: long
{
    Red,
    Green,
    Blue
}

declara una enumeración con un tipo subyacente de long.declares an enum with an underlying type of long. Un programador puede optar por usar un tipo subyacente de long, como en el ejemplo, para habilitar el uso de valores que están en el intervalo de long pero no en el intervalo de int, o para conservar esta opción en el futuro.A developer might choose to use an underlying type of long, as in the example, to enable the use of values that are in the range of long but not in the range of int, or to preserve this option for the future.

Modificadores de enumeraciónEnum modifiers

Un enum_declaration puede incluir opcionalmente una secuencia de modificadores de enumeración:An enum_declaration may optionally include a sequence of enum modifiers:

enum_modifier
    : 'new'
    | 'public'
    | 'protected'
    | 'internal'
    | 'private'
    ;

Es un error en tiempo de compilación que el mismo modificador aparezca varias veces en una declaración de enumeración.It is a compile-time error for the same modifier to appear multiple times in an enum declaration.

Los modificadores de una declaración de enumeración tienen el mismo significado que los de una declaración de clase (modificadores de clase).The modifiers of an enum declaration have the same meaning as those of a class declaration (Class modifiers). Tenga en cuenta, sin embargo, que los modificadores abstract y sealed no se permiten en una declaración de enumeración.Note, however, that the abstract and sealed modifiers are not permitted in an enum declaration. Las enumeraciones no pueden ser abstractas y no permiten la derivación.Enums cannot be abstract and do not permit derivation.

Enumerar miembrosEnum members

El cuerpo de una declaración de tipo enum define cero o más miembros de enumeración, que son las constantes con nombre del tipo enum.The body of an enum type declaration defines zero or more enum members, which are the named constants of the enum type. Dos miembros de enumeración no pueden tener el mismo nombre.No two enum members can have the same name.

enum_member_declarations
    : enum_member_declaration (',' enum_member_declaration)*
    ;

enum_member_declaration
    : attributes? identifier ('=' constant_expression)?
    ;

Cada miembro de la enumeración tiene un valor constante asociado.Each enum member has an associated constant value. El tipo de este valor es el tipo subyacente de la enumeración contenedora.The type of this value is the underlying type for the containing enum. El valor constante para cada miembro de la enumeración debe estar en el intervalo del tipo subyacente de la enumeración.The constant value for each enum member must be in the range of the underlying type for the enum. El ejemploThe example

enum Color: uint
{
    Red = -1,
    Green = -2,
    Blue = -3
}

produce un error en tiempo de compilación porque los valores constantes -1, -2 y -3 no están en el intervalo del tipo entero subyacente uint.results in a compile-time error because the constant values -1, -2, and -3 are not in the range of the underlying integral type uint.

Varios miembros de enumeración pueden compartir el mismo valor asociado.Multiple enum members may share the same associated value. El ejemploThe example

enum Color 
{
    Red,
    Green,
    Blue,

    Max = Blue
}

muestra una enumeración en la que dos miembros de enumeración (Blue y Max) tienen el mismo valor asociado.shows an enum in which two enum members -- Blue and Max -- have the same associated value.

El valor asociado de un miembro de enumeración se asigna de forma implícita o explícita.The associated value of an enum member is assigned either implicitly or explicitly. Si la declaración del miembro de enumeración tiene un inicializador constant_expression , el valor de esa expresión constante, convertido implícitamente en el tipo subyacente de la enumeración, es el valor asociado del miembro de enumeración.If the declaration of the enum member has a constant_expression initializer, the value of that constant expression, implicitly converted to the underlying type of the enum, is the associated value of the enum member. Si la declaración del miembro de enumeración no tiene inicializador, su valor asociado se establece implícitamente, como se indica a continuación:If the declaration of the enum member has no initializer, its associated value is set implicitly, as follows:

  • Si el miembro de la enumeración es el primer miembro de la enumeración declarado en el tipo de enumeración, su valor asociado es cero.If the enum member is the first enum member declared in the enum type, its associated value is zero.
  • De lo contrario, el valor asociado del miembro de enumeración se obtiene aumentando el valor asociado del miembro de enumeración anterior textualmente en uno.Otherwise, the associated value of the enum member is obtained by increasing the associated value of the textually preceding enum member by one. Este aumento de valor debe estar dentro del intervalo de valores que se puede representar mediante el tipo subyacente; de lo contrario, se producirá un error en tiempo de compilación.This increased value must be within the range of values that can be represented by the underlying type, otherwise a compile-time error occurs.

El ejemploThe example

using System;

enum Color
{
    Red,
    Green = 10,
    Blue
}

class Test
{
    static void Main() {
        Console.WriteLine(StringFromColor(Color.Red));
        Console.WriteLine(StringFromColor(Color.Green));
        Console.WriteLine(StringFromColor(Color.Blue));
    }

    static string StringFromColor(Color c) {
        switch (c) {
            case Color.Red: 
                return String.Format("Red = {0}", (int) c);

            case Color.Green:
                return String.Format("Green = {0}", (int) c);

            case Color.Blue:
                return String.Format("Blue = {0}", (int) c);

            default:
                return "Invalid color";
        }
    }
}

imprime los nombres de miembro de enumeración y sus valores asociados.prints out the enum member names and their associated values. El resultado es el siguiente:The output is:

Red = 0
Green = 10
Blue = 11

por los siguientes motivos:for the following reasons:

  • al miembro de enumeración Red se le asigna automáticamente el valor cero (ya que no tiene inicializador y es el primer miembro de la enumeración);the enum member Red is automatically assigned the value zero (since it has no initializer and is the first enum member);
  • al miembro de enumeración Green se le asigna explícitamente el valor 10;the enum member Green is explicitly given the value 10;
  • Además, al miembro de enumeración Blue se le asigna automáticamente el valor uno mayor que el miembro que lo precede textualmente.and the enum member Blue is automatically assigned the value one greater than the member that textually precedes it.

El valor asociado de un miembro de enumeración no puede, directa ni indirectamente, usar el valor de su propio miembro de enumeración asociado.The associated value of an enum member may not, directly or indirectly, use the value of its own associated enum member. Aparte de esta restricción de circularidad, los inicializadores de miembros de enumeración pueden hacer referencia libremente a otros inicializadores de miembro de enumeración, independientemente de su posición textual.Other than this circularity restriction, enum member initializers may freely refer to other enum member initializers, regardless of their textual position. Dentro de un inicializador de miembro de enumeración, los valores de otros miembros de enumeración siempre se tratan como si tuvieran el tipo de su tipo subyacente, por lo que no es necesario realizar conversiones cuando se hace referencia a otros miembros de enumeración.Within an enum member initializer, values of other enum members are always treated as having the type of their underlying type, so that casts are not necessary when referring to other enum members.

El ejemploThe example

enum Circular
{
    A = B,
    B
}

produce un error en tiempo de compilación porque las declaraciones de A y B son circulares.results in a compile-time error because the declarations of A and B are circular. A depende de B explícitamente y B depende de A implícitamente.A depends on B explicitly, and B depends on A implicitly.

Los miembros de enumeración tienen un nombre y tienen el ámbito de una manera exactamente análoga a los campos de las clases.Enum members are named and scoped in a manner exactly analogous to fields within classes. El ámbito de un miembro de enumeración es el cuerpo de su tipo de enumeración contenedor.The scope of an enum member is the body of its containing enum type. Dentro de ese ámbito, se puede hacer referencia a los miembros de enumeración por su nombre simple.Within that scope, enum members can be referred to by their simple name. Desde el resto del código, el nombre de un miembro de enumeración debe estar calificado con el nombre de su tipo de enumeración.From all other code, the name of an enum member must be qualified with the name of its enum type. Los miembros de enumeración no tienen ninguna accesibilidad declarada: se puede acceder a un miembro de enumeración si se puede tener acceso a su tipo de enumeración contenedor.Enum members do not have any declared accessibility -- an enum member is accessible if its containing enum type is accessible.

Tipo System. EnumThe System.Enum type

El tipo System.Enum es la clase base abstracta de todos los tipos de enumeración (es distinto y diferente del tipo subyacente del tipo de enumeración) y los miembros heredados de System.Enum están disponibles en cualquier tipo de enumeración.The type System.Enum is the abstract base class of all enum types (this is distinct and different from the underlying type of the enum type), and the members inherited from System.Enum are available in any enum type. Existe una conversión boxing (conversiones boxing) de cualquier tipo de enumeración a System.Enum, y existe una conversión unboxing (conversiones unboxing) de System.Enum a cualquier tipo de enumeración.A boxing conversion (Boxing conversions) exists from any enum type to System.Enum, and an unboxing conversion (Unboxing conversions) exists from System.Enum to any enum type.

Tenga en cuenta que System.Enum no es una enum_type.Note that System.Enum is not itself an enum_type. En su lugar, es un class_type del que se derivan todos los enum_type.Rather, it is a class_type from which all enum_types are derived. El tipo System.Enum hereda del tipo System.ValueType (el tipo System. ValueType), que, a su vez, hereda del tipo object.The type System.Enum inherits from the type System.ValueType (The System.ValueType type), which, in turn, inherits from type object. En tiempo de ejecución, un valor de tipo System.Enum puede ser null o una referencia a un valor de conversión boxing de cualquier tipo de enumeración.At run-time, a value of type System.Enum can be null or a reference to a boxed value of any enum type.

Valores de enumeración y operacionesEnum values and operations

Cada tipo de enumeración define un tipo distinto; se requiere una conversión de enumeración explícita (conversiones explícitas de enumeración) para realizar la conversión entre un tipo de enumeración y un tipo entero, o entre dos tipos de enumeración.Each enum type defines a distinct type; an explicit enumeration conversion (Explicit enumeration conversions) is required to convert between an enum type and an integral type, or between two enum types. El conjunto de valores que puede tomar un tipo de enumeración no está limitado por sus miembros de enumeración.The set of values that an enum type can take on is not limited by its enum members. En concreto, cualquier valor del tipo subyacente de una enumeración se puede convertir al tipo de enumeración y es un valor válido distinto de ese tipo de enumeración.In particular, any value of the underlying type of an enum can be cast to the enum type, and is a distinct valid value of that enum type.

Los miembros de enumeración tienen el tipo de su tipo de enumeración contenedor (excepto en otros inicializadores de miembro de enumeración: vea miembros de enumeración).Enum members have the type of their containing enum type (except within other enum member initializers: see Enum members). El valor de un miembro de enumeración declarado en el tipo de enumeración E con el valor asociado v es (E)v.The value of an enum member declared in enum type E with associated value v is (E)v.

Los operadores siguientes se pueden usar en valores de tipos de enumeración: ==, !=, <, >, <=, >= @ no__t-6 (operadores de comparación de enumeración), Binary + @ no__t-9 (operador de suma), Binary 1 @ No__ t-12 (operador de resta), 4, 5, 6 @ no__t-17 (operadores lógicos de enumeración), 9 @ no__t-20 (operador de complemento bit a bit), 2 y 3 @ no__t-24 (incremento depostfijo operadores de decremento y reducción y operadores de incremento y decremento prefijos.The following operators can be used on values of enum types: ==, !=, <, >, <=, >= (Enumeration comparison operators), binary + (Addition operator), binary - (Subtraction operator), ^, &, | (Enumeration logical operators), ~ (Bitwise complement operator), ++ and -- (Postfix increment and decrement operators and Prefix increment and decrement operators).

Cada tipo de enumeración se deriva automáticamente de la clase System.Enum (que, a su vez, deriva de System.ValueType y object).Every enum type automatically derives from the class System.Enum (which, in turn, derives from System.ValueType and object). Por lo tanto, los métodos y las propiedades heredados de esta clase se pueden utilizar en los valores de un tipo de enumeración.Thus, inherited methods and properties of this class can be used on values of an enum type.