Enumerationstypen (C#-Referenz)

Ein Enumerationstyp (oder enum-Typ) ist ein Werttyp, der durch eine Reihe benannter Konstanten des zugrunde liegenden integralen numerischen Typs definiert wird. Um einen Enumerationstyp zu definieren, verwenden Sie das enum-Schlüsselwort und geben die Namen von enum an:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

Standardmäßig sind die zugeordneten Konstantenwerte von Enumerationsmembern vom Typ int. Sie beginnen mit null und erhöhen sich um eins gemäß der Definitionstextreihenfolge. Sie können einen beliebigen anderen integralen numerischen Typ als zugrunde liegenden Typ eines Enumerationstyps explizit angeben. Sie können auch explizit die zugeordneten Konstantenwerte angeben, wie im folgenden Beispiel gezeigt:

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

In der Definition eines Enumerationstyps kann keine Methode definiert werden. Zum Hinzufügen von Funktionen zu einem Enumerationstyp erstellen Sie eine Erweiterungsmethode.

Der Standardwert eines Enumerationstyps E ist der Wert, der vom Ausdruck (E)0 generiert wird, auch wenn NULL nicht über den entsprechenden Enumerationsmember verfügt.

Sie verwenden einen Enumerationstyp, um eine Auswahl aus einer Reihe von sich gegenseitig ausschließenden Werten oder eine Kombination aus Auswahlmöglichkeiten darzustellen. Um eine Kombination aus Auswahlmöglichkeiten darzustellen, definieren Sie einen Enumerationstyp als Bitflags.

Enumerationstypen als Bitflags

Wenn ein Enumerationstyp eine Kombination aus Auswahlmöglichkeiten darstellen soll, definieren Sie Enumerationsmember für diese Auswahlmöglichkeiten, sodass eine einzelne Auswahl ein Bitfeld ist. Das heißt, die zugeordneten Werte dieser Enumerationsmember sollten Zweierpotenzen sein. Anschließend können Sie die bitweisen logischen Operatoren oder & verwenden, um Auswahlmöglichkeiten bzw. Schnittmengen von Auswahlmöglichkeiten zu kombinieren. Um anzugeben, dass ein Enumerationstyp Bitfelder deklariert, wenden Sie das Attribut Flags darauf an. Wie im folgenden Beispiel gezeigt, können Sie auch einige typische Kombinationen in die Definition eines Enumerationstyps einschließen.

[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
    }
}

Weitere Informationen und Beispiele finden Sie auf der Referenzseite zur System.FlagsAttribute-API und im Abschnitt System.FlagsAttribute der Referenzseite zur System.Enum-API.

Der System.Enum-Typ und die enum-Einschränkung

Der System.Enum-Typ ist die abstrakte Basisklasse aller Enumerationstypen. Er bietet eine Reihe von Methoden, um Informationen zu einem Enumerationstyp und seinen Werten abzurufen. Weitere Informationen und Beispiele finden Sie auf der Referenzseite zur System.Enum-API.

Ab C# 7.3 können Sie System.Enum in einer Basisklasseneinschränkung (die als System.Enum bezeichnet wird) verwenden, um anzugeben, dass ein Typparameter ein Enumerationstyp ist. Jeder Enumerationstyp erfüllt auch die struct-Einschränkung, die verwendet wird, um anzugeben, dass ein Typparameter ein Non-Nullable-Werttyp ist.

Konvertierungen

Für jeden Enumerationstyp gibt es explizite Konvertierungen zwischen dem Enumerationstyp und dem zugrunde liegenden integralen Typ. Wenn Sie einen Enumerationswert in den zugrunde liegenden Typ umwandeln, ist das Ergebnis der zugeordnete integrale Wert eines Enumerationsmembers.

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
    }
}

Verwenden Sie die Enum.IsDefined-Methode, um zu ermitteln, ob ein Enumerationstyp einen Enumerationsmember mit dem bestimmten zugeordneten Wert enthält.

Für jeden Enumerationstyp gibt es Boxing- und Unboxing-Konvertierungen in bzw. aus dem -Typ.

C#-Sprachspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation:

Siehe auch