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

Aktualisiert: November 2007

In einer generischen Typdefinition wird die where-Klausel verwendet, um Einschränkungen für die Typen festlegen, die als Argumente für einen Typparameter verwendet werden können, der in einer generischen Deklaration definiert ist. Eine generische Klasse, MyGenericClass, kann beispielsweise so deklariert werden, dass der Typparameter T die IComparable<T>-Schnittstelle implementiert:

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

Weitere Informationen über die where-Klausel in einem Abfrageausdruck finden Sie unter where-Klausel (C#-Referenz).

Zusätzlich zu Schnittstelleneinschränkungen kann eine where-Klausel eine Basisklasseneinschränkung einschließen, die bestimmt, dass ein Typ über die angegebene Klasse als Basisklasse verfügen muss (oder diese selbst sein muss), damit er als Typargument für diesen generischen Typ verwendet werden kann. Wird eine solche Einschränkung verwendet, muss sie vor jeder anderen Einschränkung für diesen Typparameter stehen.

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

Die where-Klausel kann auch eine Konstruktoreinschränkung einschließen. Mit dem Operator "new" ist es möglich, eine Instanz eines Typparameters zu erstellen. Hierfür muss der Typparameter allerdings durch die Konstruktoreinschränkung new() eingeschränkt sein. Die new()-Einschränkung informiert den Compiler, dass jedes Typargument, das übergeben wird, einen zugreifbaren, parameterlosen oder Standardkonstruktor aufweisen muss. 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 ist an letzter Position in der where-Klausel angegeben.

Verwenden Sie bei mehreren Typparametern eine where-Klausel pro Typparameter, 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 Typparameter generischer Methoden mit Einschränkungen versehen, wie hier:

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

Beachten Sie, dass die Syntax zur Beschreibung von Typparametereinschränkungen in Delegaten identisch ist mit der Syntax von Methoden:

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

Informationen zu generischen Delegaten finden Sie unter Generische Delegaten.

Details zu Syntax und Verwendung von Einschränkungen finden Sie unter Einschränkungen für Typparameter.

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten von C#-Programmiersprachenspezifikation:

  • 19.1.4 Einschränkungen

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Einführung in Generika (C#-Programmierhandbuch)

new-Einschränkung (C#-Referenz)

Einschränkungen für Typparameter (C#-Programmierhandbuch)

Weitere Ressourcen

C#-Referenz