Typtestoperatoren und Cast-Ausdrücke (C#-Referenz)Type-testing operators and cast expression (C# reference)

Sie können die folgenden Operatoren und Ausdrücke zur Überprüfung oder Konvertierung von Typen verwenden:You can use the following operators and expressions to perform type checking or type conversion:

  • is-Operator: Prüft, ob der Laufzeittyp eines Ausdrucks mit einem angegebenen Typ kompatibel ist.is operator: to check if the runtime type of an expression is compatible with a given type
  • as-Operator: Konvertiert einen Ausdruck explizit in einen angegebenen Typ, wenn der Laufzeittyp mit diesem Typ kompatibel ist.as operator: to explicitly convert an expression to a given type if its runtime type is compatible with that type
  • Cast-Ausdruck: Führt eine explizite Konvertierung durchcast expression: to perform an explicit conversion
  • typeof-Operator: Ruft die System.Type-Instanz für einen Typ ab.typeof operator: to obtain the System.Type instance for a type

is-Operatoris operator

Der is-Operator prüft, ob der Laufzeittyp eines Ausdrucksergebnisses mit einem angegebenen Typ kompatibel ist.The is operator checks if the runtime type of an expression result is compatible with a given type. Ab C# 7.0 überprüft der is-Operator ein Ausdrucksergebnis auch anhand eines Musters.Beginning with C# 7.0, the is operator also tests an expression result against a pattern.

Der Ausdruck mit dem is-Operator für die Typüberprüfung weist folgende Form auf:The expression with the type-testing is operator has the following form

E is T

Hierbei ist E ein Ausdruck, der einen Wert zurückgibt, und T ist der Name eines Typs oder Typparameters.where E is an expression that returns a value and T is the name of a type or a type parameter. E kann weder eine anonyme Methode noch ein Lambdaausdruck sein.E cannot be an anonymous method or a lambda expression.

Der E is T-Ausdruck gibt true zurück, wenn das Ergebnis von E nicht NULL ist und durch eine Verweis-, eine Boxing- oder eine Unboxingkonvertierung in den Typ T konvertiert werden kann. Andernfalls gibt der Ausdruck false zurück.The E is T expression returns true if the result of E is non-null and can be converted to type T by a reference conversion, a boxing conversion, or an unboxing conversion; otherwise, it returns false. Der is-Operator berücksichtigt keine benutzerdefinierten Konvertierungen.The is operator doesn't consider user-defined conversions.

Das folgende Beispiel zeigt, dass der is-Operator true zurückgibt, wenn der Laufzeittyp eines Ausdrucksergebnisses von einem angegebenen Typ abgeleitet ist, wenn also eine Verweiskonvertierung zwischen Typen besteht:The following example demonstrates that the is operator returns true if the runtime type of an expression result derives from a given type, that is, there exists a reference conversion between types:

public class Base { }

public class Derived : Base { }

public static class IsOperatorExample
{
    public static void Main()
    {
        object b = new Base();
        Console.WriteLine(b is Base);  // output: True
        Console.WriteLine(b is Derived);  // output: False

        object d = new Derived();
        Console.WriteLine(d is Base);  // output: True
        Console.WriteLine(d is Derived); // output: True
    }
}

Das nächste Beispiel zeigt, dass der is-Operator Boxing- und Unboxingkonvertierungen berücksichtigt, numerische Konvertierungen aber nicht:The next example shows that the is operator takes into account boxing and unboxing conversions but doesn't consider numeric conversions:

int i = 27;
Console.WriteLine(i is System.IFormattable);  // output: True

object iBoxed = i;
Console.WriteLine(iBoxed is int);  // output: True
Console.WriteLine(iBoxed is long);  // output: False

Informationen zu C#-Konvertierungen finden Sie im Kapitel Konvertierungen der C#-Sprachspezifikation.For information about C# conversions, see the Conversions chapter of the C# language specification.

Typüberprüfung mit MusterabgleichType testing with pattern matching

Ab C# 7.0 überprüft der is-Operator ein Ausdrucksergebnis auch anhand eines Musters.Beginning with C# 7.0, the is operator also tests an expression result against a pattern. Insbesondere wird das Typmuster in der folgenden Form unterstützt:In particular, it supports the type pattern in the following form:

E is T v

Hierbei ist E ein Ausdruck, der einen Wert zurückgibt, T ist der Name eines Typs oder Typparameters, und v ist eine neue lokale Variable des Typs T.where E is an expression that returns a value, T is the name of a type or a type parameter, and v is a new local variable of type T. Wenn das Ergebnis von E ungleich NULL ist und durch eine Verweis-, eine Boxing- oder eine Unboxingkonvertierung in T konvertiert werden kann, gibt der E is T v-Ausdruck true zurück, und der konvertierte Wert des Ergebnisses von E wird der Variable v zugewiesen.If the result of E is non-null and can be converted to T by a reference, boxing, or unboxing conversion, the E is T v expression returns true and the converted value of the result of E is assigned to variable v.

Das folgende Beispiel veranschaulicht die Verwendung des is-Operators mit dem Typmuster:The following example demonstrates the usage of the is operator with the type pattern:

int i = 23;
object iBoxed = i;
int? jNullable = 7;
if (iBoxed is int a && jNullable is int b)
{
    Console.WriteLine(a + b);  // output 30
}

Weitere Informationen zum Typmuster und weiteren unterstützten Mustern finden Sie unter Musterabgleich mit „is“.For more information about the type pattern and other supported patterns, see Pattern matching with is.

as-Operatoras operator

Der as-Operator konvertiert das Ergebnis eines Ausdrucks explizit in einen angegebenen Verweis- oder Nullable-Typ.The as operator explicitly converts the result of an expression to a given reference or nullable value type. Wenn die Konvertierung nicht möglich ist, gibt der as-Operator null zurück.If the conversion is not possible, the as operator returns null. Im Gegensatz zum Cast-Ausdruck löst der as-Operator nie eine Ausnahme aus.Unlike a cast expression, the as operator never throws an exception.

Sehen Sie sich diesen Ausdruck an:The expression of the form

E as T

Hierbei ist E ein Ausdruck, der einen Wert zurückgibt, und T ist der Name eines Typs oder Typparameters. Das führt zum gleichen Ergebnis wie dies:where E is an expression that returns a value and T is the name of a type or a type parameter, produces the same result as

E is T ? (T)(E) : (T)null

außer dass E nur einmal überprüft wird.except that E is only evaluated once.

Der as-Operator berücksichtigt nur Verweis-, Nullable-, Boxing- und Unboxingkonvertierungen.The as operator considers only reference, nullable, boxing, and unboxing conversions. Sie können den as-Operator nicht verwenden, um eine benutzerdefinierte Konvertierung auszuführen.You cannot use the as operator to perform a user-defined conversion. Verwenden Sie hierzu einen Cast-Ausdruck.To do that, use a cast expression.

Im folgenden Beispiel wird die Verwendung des as-Operators veranschaulicht:The following example demonstrates the usage of the as operator:

IEnumerable<int> numbers = new[] { 10, 20, 30 };
IList<int> indexable = numbers as IList<int>;
if (indexable != null)
{
    Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]);  // output: 40
}

Hinweis

Wie das vorherige Beispiel zeigt, müssen Sie das Ergebnis des as-Ausdrucks mit null vergleichen, um zu überprüfen, ob die Konvertierung erfolgreich war.As the preceding example shows, you need to compare the result of the as expression with null to check if the conversion is successful. Ab C# 7.0 können Sie den is-Operator verwenden, um sowohl die erfolgreiche Durchführung der Konvertierung zu überprüfen als auch bei Erfolg das Ergebnis einer neuen Variable zuzuweisen.Beginning with C# 7.0, you can use the is operator both to test if the conversion succeeds and, if it succeeds, assign its result to a new variable.

Cast-AusdruckCast expression

Ein cast-Ausdruck der Form (T)E führt eine explizite Konvertierung des Ergebnisses des Ausdrucks E in den Typ T durch.A cast expression of the form (T)E performs an explicit conversion of the result of expression E to type T. Wenn keine explizite Konvertierung von Typ E in Typ T möglich ist, tritt ein Fehler während der Kompilierung auf.If no explicit conversion exists from the type of E to type T, a compile-time error occurs. Möglicherweise ist eine explizite Konvertierung zur Laufzeit nicht erfolgreich, und ein cast-Ausdruck löst eine Ausnahme aus.At run time, an explicit conversion might not succeed and a cast expression might throw an exception.

Das folgende Beispiel zeigt explizite numerische und Verweiskonvertierungen:The following example demonstrates explicit numeric and reference conversions:

double x = 1234.7;
int a = (int)x;
Console.WriteLine(a);   // output: 1234

IEnumerable<int> numbers = new int[] { 10, 20, 30 };
IList<int> list = (IList<int>)numbers;
Console.WriteLine(list.Count);  // output: 3
Console.WriteLine(list[1]);  // output: 20

Informationen zu expliziten Konvertierungen finden Sie im Abschnitt Explizite Konvertierungen der C#-Sprachspezifikation.For information about supported explicit conversions, see the Explicit conversions section of the C# language specification. Informationen zum Definieren einer benutzerdefinierten expliziten oder impliziten Typkonvertierung finden Sie unter Benutzerdefinierte Konvertierungsoperatoren.For information about how to define a custom explicit or implicit type conversion, see User-defined conversion operators.

Andere Verwendungen von „()“Other usages of ()

Sie verwenden Klammern auch zum Aufrufen einer Methode oder eines Delegaten.You also use parentheses to call a method or invoke a delegate.

Mit Klammern können Sie auch die Reihenfolge anpassen, in der Vorgänge in einem Ausdruck ausgewertet werden sollen.Other use of parentheses is to adjust the order in which to evaluate operations in an expression. Weitere Informationen finden Sie unter C#-Operatoren.For more information, see C# operators.

typeof-Operatortypeof operator

Der typeof-Operator ruft die System.Type-Instanz für einen Typ ab.The typeof operator obtains the System.Type instance for a type. Das Argument für den typeof-Operator muss der Name eines Typs oder Typparameters sein, wie das folgende Beispiel zeigt:The argument to the typeof operator must be the name of a type or a type parameter, as the following example shows:

void PrintType<T>() => Console.WriteLine(typeof(T));

Console.WriteLine(typeof(List<string>));
PrintType<int>();
PrintType<System.Int32>();
PrintType<Dictionary<int, char>>();
// Output:
// System.Collections.Generic.List`1[System.String]
// System.Int32
// System.Int32
// System.Collections.Generic.Dictionary`2[System.Int32,System.Char]

Sie können den typeof-Operator auch mit ungebundenen generischen Typen verwenden.You can also use the typeof operator with unbound generic types. Der Name eines ungebundenen generischen Typs muss die entsprechende Anzahl von Kommas enthalten: eines weniger als die Anzahl von Typparametern.The name of an unbound generic type must contain the appropriate number of commas, which is one less than the number of type parameters. Das folgende Beispiel zeigt die Verwendung des typeof-Operators mit einem ungebundenen generischen Typ:The following example shows the usage of the typeof operator with an unbound generic type:

Console.WriteLine(typeof(Dictionary<,>));
// Output:
// System.Collections.Generic.Dictionary`2[TKey,TValue]

Ein Ausdruck kann kein Argument des typeof-Operators sein.An expression cannot be an argument of the typeof operator. Verwenden Sie die Object.GetType-Methode, um die System.Type-Instanz für den Laufzeittyp eines Ausdrucksergebnisses abzurufen.To get the System.Type instance for the runtime type of an expression result, use the Object.GetType method.

Typüberprüfung mit dem typeof-OperatorType testing with the typeof operator

Verwenden Sie den typeof-Operator, um zu überprüfen, ob der Laufzeittyp des Ausdrucksergebnisses exakt mit einem angegebenen Typ übereinstimmt.Use the typeof operator to check if the runtime type of the expression result exactly matches a given type. Das folgende Beispiel zeigt den Unterschied zwischen der Typüberprüfung mit dem typeof-Operator und mit dem is-Operator:The following example demonstrates the difference between type checking performed with the typeof operator and the is operator:

public class Animal { }

public class Giraffe : Animal { }

public static class TypeOfExample
{
    public static void Main()
    {
        object b = new Giraffe();
        Console.WriteLine(b is Animal);  // output: True
        Console.WriteLine(b.GetType() == typeof(Animal));  // output: False

        Console.WriteLine(b is Giraffe);  // output: True
        Console.WriteLine(b.GetType() == typeof(Giraffe));  // output: True
    }
}

OperatorüberladbarkeitOperator overloadability

Die Operatoren is, as und typeof können nicht überladen werden.The is, as, and typeof operators cannot be overloaded.

Ein benutzerdefinierter Typ kann den ()-Operator nicht überladen, kann aber benutzerdefinierte Typkonvertierungen definieren, die durch einen cast-Ausdruck ausgeführt werden können.A user-defined type cannot overload the () operator, but can define custom type conversions that can be performed by a cast expression. Weitere Informationen finden Sie unter Benutzerdefinierte Konvertierungsoperatoren.For more information, see User-defined conversion operators.

C#-SprachspezifikationC# language specification

Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation:For more information, see the following sections of the C# language specification:

Siehe auchSee also