Типы перечислений (справочник по C#)Enumeration types (C# reference)

Тип перечисления (или тип enum) — это тип значения, определенный набором именованных констант применяемого целочисленного типа.An enumeration type (or enum type) is a value type defined by a set of named constants of the underlying integral numeric type. Чтобы определить тип перечисления, используйте ключевое слово enum и укажите имена элементов перечисления:To define an enumeration type, use the enum keyword and specify the names of enum members:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

По умолчанию связанные значения констант элементов перечисления имеют тип int. Они начинаются с нуля и увеличиваются на единицу в соответствии с порядком текста определения.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. Вы можете явно указать любой другой целочисленный тип в качестве базового типа перечисления.You can explicitly specify any other integral numeric type as an underlying type of an enumeration type. Вы можете также явно указать соответствующие значения констант, как показано в следующем примере.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
}

Вы не можете определить метод внутри определения типа перечисления.You cannot define a method inside the definition of an enumeration type. Чтобы добавить функциональные возможности к типу перечисления, создайте метод расширения.To add functionality to an enumeration type, create an extension method.

Значением по умолчанию для типа перечисления E является значение, созданное выражением (E)0, даже если ноль не имеет соответствующего элемента перечисления.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.

Тип перечисления используется для представления выбора из набора взаимоисключающих значений или комбинации вариантов выбора.You use an enumeration type to represent a choice from a set of mutually exclusive values or a combination of choices. Чтобы представить комбинацию вариантов выбора, определите тип перечисления как битовые флаги.To represent a combination of choices, define an enumeration type as bit flags.

Типы перечислений как битовые флагиEnumeration types as bit flags

Если вам необходимо, чтобы тип перечисления представлял комбинацию вариантов выбора, определите элементы перечисления для этих вариантов так, чтобы отдельный выбор был битовым полем.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. То есть связанные значения этих элементов перечисления должны быть степенями двух.That is, the associated values of those enum members should be the powers of two. Затем вы можете использовать побитовые логические операторы | или &, чтобы комбинировать варианты выбора или пересекать комбинации вариантов выбора соответственно.Then, you can use the bitwise logical operators | or & to combine choices or intersect combinations of choices, respectively. Чтобы указать, что тип перечисления объявляет битовые поля, примените к нему атрибут Flags.To indicate that an enumeration type declares bit fields, apply the Flags attribute to it. Как показано в следующем примере, вы можете включить некоторые типичные комбинации в определение типа перечисления.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
    }
}

Дополнительные сведения и примеры см. на странице справочника по API System.FlagsAttribute и в разделе о неисключительных элементах и атрибутах Flags страницы справочника по API 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.

Тип System.Enum и ограничение перечисленияThe System.Enum type and enum constraint

Тип System.Enum является абстрактным базовым классом всех типов перечисления.The System.Enum type is the abstract base class of all enumeration types. Он предоставляет различные методы, позволяющие получить информацию о типе перечисления и его значениях.It provides a number of methods to get information about an enumeration type and its values. Дополнительные сведения и примеры см. на странице справочника по API System.Enum.For more information and examples, see the System.Enum API reference page.

Начиная с C# версии 7.3, вы можете использовать тип System.Enum в ограничении базового класса (которое известно как ограничение перечисления), чтобы указать, что параметр типа является типом перечисления.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.

ПреобразованияConversions

Для любого типа перечисления существуют явные преобразования между типом перечисления и его базовым целочисленным типом.For any enumeration type, there exist explicit conversions between the enumeration type and its underlying integral type. Если вы привели значение перечисления к его базовому типу, то результатом будет связанное целочисленное значение элемента перечисления.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
    }
}

Используйте метод Enum.IsDefined, чтобы определить, содержит ли тип перечисления элемент перечисления с определенным связанным значением.Use the Enum.IsDefined method to determine whether an enumeration type contains an enum member with the certain associated value.

Для любого типа перечисления существует упаковка — преобразование и распаковка — преобразование в тип System.Enum и из него соответственно.For any enumeration type, there exist boxing and unboxing conversions to and from the System.Enum type, respectively.

Спецификация языка C#C# language specification

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:For more information, see the following sections of the C# language specification:

См. такжеSee also