Tipos de enumeración (referencia de C#)Enumeration types (C# reference)

Un tipo de enumeración es un tipo de valor definido por un conjunto de constantes con nombre del tipo numérico integral subyacente.An enumeration type (or enum type) is a value type defined by a set of named constants of the underlying integral numeric type. Para definir un tipo de enumeración, use la palabra clave enum y especifique los nombres de miembros de enumeración:To define an enumeration type, use the enum keyword and specify the names of enum members:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

De forma predeterminada, los valores de constante asociados de miembros de enumeración son del tipo int; comienzan con cero y aumentan en uno después del orden del texto de la definición.By default, the associated constant values of enum members are of type int; they start with zero and increase by one following the definition text order. Puede especificar explícitamente cualquier otro tipo de numérico entero como un tipo subyacente de un tipo de enumeración.You can explicitly specify any other integral numeric type as an underlying type of an enumeration type. También puede especificar explícitamente los valores de constante asociados, como se muestra en el ejemplo siguiente:You can also explicitly specify the associated constant values, as the following example shows:

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

No se puede definir un método dentro de la definición de un tipo de enumeración.You cannot define a method inside the definition of an enumeration type. Para agregar funcionalidad a un tipo de enumeración, cree un método de extensión.To add functionality to an enumeration type, create an extension method.

El valor predeterminado de un tipo de enumeración E es el valor generado por la expresión (E)0, incluso si cero no tiene el miembro de enumeración correspondiente.The default value of an enumeration type E is the value produced by expression (E)0, even if zero doesn't have the corresponding enum member.

Un tipo de enumeración se usa para representar una opción de un conjunto de valores mutuamente excluyentes o una combinación de opciones.You use an enumeration type to represent a choice from a set of mutually exclusive values or a combination of choices. Para representar una combinación de opciones, defina un tipo de enumeración como marcas de bits.To represent a combination of choices, define an enumeration type as bit flags.

Tipos de enumeración como marcas de bitsEnumeration types as bit flags

Si quiere que un tipo de enumeración represente una combinación de opciones, defina los miembros de enumeración de esas opciones de modo que una opción individual sea un campo de bits.If you want an enumeration type to represent a combination of choices, define enum members for those choices such that an individual choice is a bit field. Es decir, los valores asociados de esos miembros de enumeración deben ser las potencias de dos.That is, the associated values of those enum members should be the powers of two. Luego, puede usar los operadores lógicos bit a bit| o & para combinar o formar intersección de combinaciones de opciones, respectivamente.Then, you can use the bitwise logical operators | or & to combine choices or intersect combinations of choices, respectively. Para indicar que un tipo de enumeración declara campos de bits, aplíquele el atributo Flags.To indicate that an enumeration type declares bit fields, apply the Flags attribute to it. Como se muestra en el ejemplo siguiente, también puede incluir algunas combinaciones típicas en la definición de un tipo de enumeración.As the following example shows, you can also include some typical combinations in the definition of an enumeration type.

[Flags]
public enum Days
{
    None      = 0b_0000_0000,  // 0
    Monday    = 0b_0000_0001,  // 1
    Tuesday   = 0b_0000_0010,  // 2
    Wednesday = 0b_0000_0100,  // 4
    Thursday  = 0b_0000_1000,  // 8
    Friday    = 0b_0001_0000,  // 16
    Saturday  = 0b_0010_0000,  // 32
    Sunday    = 0b_0100_0000,  // 64
    Weekend   = Saturday | Sunday
}

public class FlagsEnumExample
{
    public static void Main()
    {
        Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
        Console.WriteLine(meetingDays);
        // Output:
        // Monday, Wednesday, Friday

        Days workingFromHomeDays = Days.Thursday | Days.Friday;
        Console.WriteLine($"Join a meeting by phone on {meetingDays & workingFromHomeDays}");
        // Output:
        // Join a meeting by phone on Friday

        bool isMeetingOnTuesday = (meetingDays & Days.Tuesday) == Days.Tuesday;
        Console.WriteLine($"Is there a meeting on Tuesday: {isMeetingOnTuesday}");
        // Output:
        // Is there a meeting on Tuesday: False

        var a = (Days)37;
        Console.WriteLine(a);
        // Output:
        // Monday, Wednesday, Saturday
    }
}

Para más información y ver algunos ejemplos, consulte la página de referencia de API de System.FlagsAttribute y la sección miembros no exclusivos y el atributo Flags de la página de referencia de API de System.Enum.For more information and examples, see the System.FlagsAttribute API reference page and the Non-exclusive members and the Flags attribute section of the System.Enum API reference page.

El tipo System.Enum y la restricción de enumeraciónThe System.Enum type and enum constraint

El tipo System.Enum es la clase base abstracta de todos los tipos de enumeración.The System.Enum type is the abstract base class of all enumeration types. Proporciona una serie de métodos para obtener información sobre un tipo de enumeración y sus valores.It provides a number of methods to get information about an enumeration type and its values. Para más información y ver algunos ejemplos, consulte la página de referencia de la API System.Enum.For more information and examples, see the System.Enum API reference page.

A partir C# 7.3, puede usar System.Enum en una restricción de clase base (conocida como la restricción de enumeración) para especificar que un parámetro de tipo es un tipo de enumeración.Beginning with C# 7.3, you can use System.Enum in a base class constraint (that is known as the enum constraint) to specify that a type parameter is an enumeration type.

ConversionesConversions

Para cualquier tipo de enumeración, existen conversiones explícitas entre el tipo de enumeración y su tipo entero subyacente.For any enumeration type, there exist explicit conversions between the enumeration type and its underlying integral type. Si convierte (usacast) un valor de enumeración a su tipo subyacente, el resultado es el valor entero asociado de un miembro de enumeración.If you cast an enum value to its underlying type, the result is the associated integral value of an enum member.

public enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

public class EnumConversionExample
{
    public static void Main()
    {
        Season a = Season.Autumn;
        Console.WriteLine($"Integral value of {a} is {(int)a}");  // output: Integral value of Autumn is 2

        var b = (Season)1;
        Console.WriteLine(b);  // output: Summer

        var c = (Season)4;
        Console.WriteLine(c);  // output: 4
    }
}

Use el método Enum.IsDefined para determinar si un tipo de enumeración contiene un miembro de enumeración con el valor asociado determinado.Use the Enum.IsDefined method to determine whether an enumeration type contains an enum member with the certain associated value.

Para cualquier tipo de enumeración, existen conversiones boxing y unboxing a y desde el tipo System.Enum, respectivamente.For any enumeration type, there exist boxing and unboxing conversions to and from the System.Enum type, respectively.

Especificación del lenguaje C#C# language specification

Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:For more information, see the following sections of the C# language specification:

Vea tambiénSee also