where (Einschränkung des generischen Typs) (C#-Referenz)

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. So können Sie beispielsweise eine generische Klasse erstellen, MyGenericClass, deren Typparameter T die Schnittstelle <xref:System.IComparable%601> implementiert:

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

Weitere Informationen über die where-Klausel in einem Abfrageausdruck finden Sie unter where-Klausel.

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. Wenn eine solche Einschränkung verwendet wird, muss sie vor jeder anderen Einschränkung für den Typparameter angezeigt werden.

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

Die where-Klausel kann auch eine Konstruktoreinschränkung einschließen. 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. Die new()-Einschränkung informiert den Compiler, dass jedes angegebene Typargument über einen zugänglichen parameterlosen oder Standardkonstruktor verfügen muss. Zum Beispiel:


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.

Bei mehreren Typparametern müssen Sie für jeden davon eine eigene where-Klausel verwenden, z.B.:

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:

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:

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

Informationen zu generischen Delegaten finden Sie unter Generic Delegates (Generische Delegaten).

Weitere Informationen zur Syntax und der Verwendung von Einschränkungen finden Sie unter Einschränkungen für Typparameter.

C#-Programmiersprachenspezifikation

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

Siehe auch

C#-Referenz
C#-Programmierhandbuch
Einführung in Generika
new-Einschränkung
Einschränkungen für Typparameter