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 Enumerationsmembern 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 Nicht exklusive Member und das Flags-Attribut 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.
Sie können System.Enum
in einer Basisklasseneinschränkung (die als enum-Einschränkung 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 System.Enum-Typ.
C#-Sprachspezifikation
Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation:
- Enumerationen
- Enum values and operations (Enumerationswerte und -vorgänge)
- Logische Enumerationsoperatoren
- Enumerationsvergleichsoperatoren
- Explizite Enumerationskonvertierungen
- Implizite Enumerationskonvertierungen