where (Einschränkung des generischen Typs) (C#-Referenz)where (generic type constraint) (C# Reference)

In einer generischen Typdefinition wird die where-Klausel verwendet, um Einschränkungen für Typen anzugeben, die als Argumente für einen Typenparameter verwendet werden können, der in einer generischen Deklaration definiert ist.In a generic type definition, the where clause is used to specify constraints on the types that can be used as arguments for a type parameter defined in a generic declaration. So können Sie beispielsweise eine generische Klasse erstellen, MyGenericClass, deren Typparameter T die Schnittstelle IComparable<T> implementiert:For example, you can declare a generic class, MyGenericClass, such that the type parameter T implements the IComparable<T> interface:

public class MyGenericClass<T> where T:IComparable { }  

Hinweis

Weitere Informationen über die where-Klausel in einem Abfrageausdruck finden Sie unter where-Klausel.For more information on the where clause in a query expression, see where clause.

Zusätzlich zu Schnittstelleneinschränkungen kann eine where-Klausel eine Basisklasseneinschränkung enthalten, die angibt, dass ein Typ über die angegebene Klasse als Basisklasse verfügen muss (oder diese Klasse selbst sein muss), um als Typargument für diesen generischen Typ verwendet werden zu können.In addition to interface constraints, a where clause can include a base class constraint, which states that a type must have the specified class as a base class (or be that class itself) in order to be used as a type argument for that generic type. Wenn eine solche Einschränkung verwendet wird, muss sie vor jeder anderen Einschränkung für den Typparameter angezeigt werden.If such a constraint is used, it must appear before any other constraints on that type parameter.

class MyClass<T, U>
    where T : class
    where U : struct
{ }

Die where-Klausel kann auch eine Konstruktoreinschränkung einschließen.The where clause may also include a constructor constraint. Es ist möglich, eine Instanz eines Typparameters mithilfe des neuen Operators zu erstellen. Allerdings muss zu diesem Zweck der Typparameter durch die Konstruktoreinschränkung new() eingeschränkt werden.It is possible to create an instance of a type parameter using the new operator; however, in order to do so the type parameter must be constrained by the constructor constraint, new(). Die new()-Einschränkung informiert den Compiler, dass jedes angegebene Typargument über einen zugänglichen parameterlosen oder Standardkonstruktor verfügen muss.The new() Constraint lets the compiler know that any type argument supplied must have an accessible parameterless--or default-- constructor. Zum Beispiel:For example:


public class MyGenericClass<T> where T : IComparable, new()
{
    // The following line is not possible without new() constraint:
    T item = new T();
}

Die new()-Einschränkung wird in der where-Klausel als Letztes angezeigt.The new() constraint appears last in the where clause.

Bei mehreren Typparametern müssen Sie für jeden davon eine eigene where-Klausel verwenden, z.B.:With multiple type parameters, use one where clause for each type parameter, for example:

interface IMyInterface
{
}

class Dictionary<TKey, TVal>
    where TKey : IComparable, IEnumerable
    where TVal : IMyInterface
{
    public void Add(TKey key, TVal val)
    {
    }
}

Sie können auch Einschränkungen wie folgt an Typparameter generischer Methoden anfügen:You can also attach constraints to type parameters of generic methods, like this:

public bool MyMethod<T>(T t) where T : IMyInterface { }  

Beachten Sie, dass die Syntax zum Beschreiben der Parametereinschränkungen für Delegaten mit der Syntax von Methoden identisch ist:Notice that the syntax to describe type parameter constraints on delegates is the same as that of methods:

delegate T MyDelegate<T>() where T : new()  

Informationen zu generischen Delegaten finden Sie unter Generic Delegates (Generische Delegaten).For information on generic delegates, see Generic Delegates.

Weitere Informationen zur Syntax und der Verwendung von Einschränkungen finden Sie unter Einschränkungen für Typparameter.For details on the syntax and use of constraints, see Constraints on Type Parameters.

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
Einführung in GenerikaIntroduction to Generics
new-Einschränkungnew Constraint
Einschränkungen für TypparameterConstraints on Type Parameters