De where-clausule wordt gebruikt om typebeperkingen te specificeren die als variabelen kunnen dienen voor typeparameters gedefinieerd in generieke declaraties. 1. Interfacebeperkingen. Je kunt bijvoorbeeld een generieke klasse MyGenericClass declareren, zodat de typeparameter T de IComparable-interface kan<T> implementeren:
publieke klasse MyGenericClass<T> waar T:IComparable { }
2. Basisklassebeperking: Geeft aan dat een type de gespecificeerde klasse als basisklasse moet gebruiken (of de klasse zelf) om als typeparameter voor dat generieke type te worden gebruikt. Zodra zo'n beperking is gebruikt, moet deze verschijnen vóór alle andere beperkingen op het type parameter. klasse MyClassy<T, U> waarbij T : klasse waarbij U : struct
{
}
De 3.where-clausule kan ook constructorbeperkingen bevatten. Je kunt de nieuwe operator gebruiken om een instantie van een typeparameter te creëren; Maar het type-argument moet hiervoor worden beperkt door de constructorbeperking new(). De new()-beperking laat de compiler weten dat elk type gegeven argument een toegankelijke, parameterloze (of standaard) constructor moet hebben. Bijvoorbeeld: publieke klasse MyGenericClass <T> waar T: IComparable, new()
{ De volgende regel is niet mogelijk zonder new()-beperking: T item = nieuwe T();
} De new()-beperking verschijnt aan het einde van de where-clausule.
4. Voor meerdere typeparameters gebruikt elke typeparameter een where-clausule, Bijvoorbeeld: interface MyI { } klas Woordenboek<TKey, TVal> waarbij TKey: IComparabel, IEnumerable waar TVal: MyI
{ openbare leegte Add(TKey key, TVal val)
{
}
}
5. Je kunt ook constraints koppelen aan typeparameters van generieke methoden, zoals:
publieke bool MyMethod<T>(T t) waarbij T : IMyInterface { }
Let op dat de syntaxis voor het beschrijven van typeparameterbeperkingen hetzelfde is voor zowel delegates als methoden:
delegate T MyDelegate<T>() waarbij T : new()
Generiek waar
Generiek Waar kan typeparameters worden gekwalificeerd. Er zijn verschillende manieren.
·waarbij T : struct de typeparameter beperkt die T moet erven van System.ValueType.
·waarbij T: klasse het type beperkt. De parameter T moet een referentietype zijn, dat wil zeggen, hij kan niet worden overgenomen van System.ValueType.
waarbij T : new() de typeparameter T beperkt moet een standaardconstructor hebben
·waarbij T : NameOfClass het typeparameter beperkt dat T van een klasse moet erven of een interface moet implementeren.
Deze kwalificaties kunnen worden gecombineerd, zoals: publieke klasse Punt waarbij T : klasse, IComparabel, new() |