Kus klauslit kasutatakse tüübipiirangute määramiseks, mis võivad toimida muutujatena tüüpiparameetrite jaoks, mis on määratletud üldistes deklaratsioonides. 1. Liidese piirangud. Näiteks saate deklareerida üldise klassi MyGenericClass, nii et tüübiparameeter T saab teostada IComparable<T> liidese:
public class<T> MyGenericClass, kus T:IComparable { }
2. Baasklassi piirang: Näitab, et tüüp peab kasutama määratud klassi baasklassina (või klassi ennast), et seda kasutada selle üldise tüübi tüübiparameetrina. Kui sellist piirangut on kasutatud, peab see ilmuma enne kõiki teisi parameetri tüübi piiranguid. klass MyClassy<T, U> kus T : klass kus U : struktuur
{
}
3.kus klausel võib sisaldada ka konstruktorpiiranguid. Uue operaatoriga saab luua tüübiparameetri eksemplari; Kuid tüübiargument peab olema piiratud konstruktori piiranguga new(). New() piirang annab kompilaatorile teada, et iga pakutava argumendi tüüp peab omama ligipääsetavat parameetrita (või vaikimisi) konstruktorit. Näiteks: public class <T> MyGenericClass, kus T: IComparable, new()
{ Järgmine joon ei ole võimalik ilma new() piiranguta: T ese = uus T();
} Uus() piirang ilmub kus klausli lõpus.
4. Mitme tüübiparameetri korral kasutab iga tüübiparameeter klauslit, kus Näiteks: interface MyI { } klassi sõnastik<TKey, TVal> kus TKey: IComparable, IEnumerable kus TVal: MyI
{ public void Add(TKey key, TVal val)
{
}
}
5. Üldiste meetodite tüübiparameetritele saab lisada ka piiranguid, näiteks:
public bool MyMethod<T>(T t), kus T : IMyInterface { }
Pane tähele, et tüübiparameetrite piirangute kirjeldamise süntaks on sama nii delegaatide kui ka meetodite puhul:
delegaat T <T>MyDelegate() kus T : new()
Üldine Kus
Üldine Kus võib täpsustada tüübiparameetreid. On mitu võimalust.
·kus T : struct piirab tüübi parameetrit, mille T peab pärima System.ValueType.
·kus T: klass piirab tüüpi Parameetrit T peab olema viitetüüp, st seda ei saa pärida System.ValueType'ist.
kus T : new() piirab tüübiparameetrit T peab omama vaikimisi konstruktorit
·kus T : NameOfClass piirab tüübiparameetrit, mille T peab klassist pärima või liidese rakendama.
Neid kvalifikatsioone saab kombineerida, näiteks: avalik klass Punkt kus T : klass, IComparable, new() |