Die Where-Klausel wird verwendet, um Typnebenbedingungen zu spezifizieren, die als Variablen für Typparameter in generischen Deklarationen dienen können. 1. Schnittstellenbeschränkungen. Zum Beispiel können Sie eine generische Klasse MyGenericClass deklarieren, sodass der Typparameter T die IComparable-Schnittstelle implementieren kann<T>:
öffentliche Klasse MyGenericClass<T>, wobei T:IComparable { }
2. Basisklassen-Constraint: Gibt an, dass ein Typ die spezifizierte Klasse als Basisklasse (oder die Klasse selbst) als Typparameter für diesen generischen Typ verwenden muss. Sobald eine solche Einschränkung verwendet wurde, muss sie vor allen anderen Einschränkungen auf den Parametertyp erscheinen. klasse MyClassy<T, U> wobei T : Klasse wobei U : struct
{
}
Die 3.where-Klausel kann auch Konstruktor-Einschränkungen enthalten. Man kann den neuen Operator verwenden, um eine Instanz eines Typparameters zu erstellen; Aber das Typargument muss dafür durch die Konstruktor-Constraint new() eingeschränkt werden. Die new()-Constraint zeigt dem Compiler, dass jede Art von Argument einen zugänglichen, parameterlosen (oder Standard-) Konstruktor haben muss. Zum Beispiel: öffentliche Klasse MyGenericClass <T> , wo T: IComparable, new()
{ Die folgende Linie ist ohne new()-Constraint nicht möglich: T Element = neues T();
} Die new()-Nebenbedingung erscheint am Ende der where-Klausel.
4. Für mehrere Typparameter verwendet jeder Typparameter eine where-Klausel, Zum Beispiel: Schnittstelle MyI { } Klassenwörterbuch<TKey, TVal> wobei TKey: IComparable, IEnumerable wobei TVal: MyI
{ öffentlicher Leerraum Add(TKey key, TVal val)
{
}
}
5. Sie können auch Nebenbedingungen an Typparameter generischer Methoden anhängen, wie zum Beispiel:
public bool MyMethod<T>(T t), wobei T : IMyInterface { }
Beachten Sie, dass die Syntax zur Beschreibung von Typparameter-Constraints sowohl für Delegierte als auch für Methoden gleich ist:
Delegate T MyDelegate<T>() wobei T : new()
Generisch Wo
Generisch: Wo kann man Typparameter qualifizieren. Es gibt mehrere Möglichkeiten.
·wobei T : struct den Typparameter einschränkt, den T von System.ValueType erben muss.
·wobei T: Klasse den Typ einschränkt. Der Parameter T muss ein Referenztyp sein, das heißt, er kann nicht von System.ValueType übernommen werden.
wobei T : new() den Typparameter einschränkt, T muss einen Standardkonstruktor haben
·wobei T : NameOfClass den Typparameter einschränkt, den T von einer Klasse erben oder eine Schnittstelle implementieren muss.
Diese Qualifikationen können kombiniert werden, wie zum Beispiel: öffentliche Klasse Punkt, wobei T : klasse, IComparabel, new() |