Tipos de enumeración (referencia de C#)

Un tipo de enumeración es un tipo de valor definido por un conjunto de constantes con nombre del tipo numérico integral subyacente. Para definir un tipo de enumeración, use la palabra clave enum y especifique los nombres de enum:

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. Puede especificar explícitamente cualquier otro tipo de numérico entero como un tipo subyacente de un tipo de enumeración. También puede especificar explícitamente los valores de constante asociados, como se muestra en el ejemplo siguiente:

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. Para agregar funcionalidad a un tipo de enumeración, cree un método de extensión.

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.

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. Para representar una combinación de opciones, defina un tipo de enumeración como marcas de bits.

Tipos de enumeración como marcas de bits

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. Es decir, los valores asociados de esos miembros de enumeración deben ser las potencias de dos. Luego, puede usar los operadores lógicos bit a bit o & para combinar o formar intersección de combinaciones de opciones, respectivamente. Para indicar que un tipo de enumeración declara campos de bits, aplíquele el atributo Flags. 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.

[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 System.FlagsAttribute de la página de referencia de API de System.Enum.

El tipo System.Enum y la restricción de enumeración

El tipo System.Enum es la clase base abstracta de todos los tipos de enumeración. Proporciona una serie de métodos para obtener información sobre un tipo de enumeración y sus valores. Para más información y ver algunos ejemplos, consulte la página de referencia de la API System.Enum.

A partir C# 7.3, puede usar System.Enum en una restricción de clase base (conocida como la System.Enum) para especificar que un parámetro de tipo es un tipo de enumeración. Cualquier tipo de enumeración también cumple la restricción struct, que se usa para especificar que un parámetro de tipo es un tipo de valor que no acepta valores NULL.

Conversiones

Para cualquier tipo de enumeración, existen conversiones explícitas entre el tipo de enumeración y su tipo entero subyacente. 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.

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.

Para cualquier tipo de enumeración, existen conversiones boxing y unboxing a y desde el tipo , respectivamente.

Especificación del lenguaje C#

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

Vea también