Clauza where este folosită pentru a specifica constrângeri de tip care pot servi ca variabile pentru parametrii de tip definiți în declarații generice. 1. Constrângeri de interfață. De exemplu, poți declara o clasă generică MyGenericClass, astfel încât parametrul de tip T să poată implementa<T> interfața IComparable:
clasa publică<T> MyGenericClass unde T:IComparable { }
2. Constrângerea clasei de bază: Indică faptul că un tip trebuie să folosească clasa specificată ca clasă de bază (sau clasa în sine) pentru a fi folosit ca parametru de tip pentru acel tip generic. Odată ce o astfel de constrângere este folosită, aceasta trebuie să apară înaintea tuturor celorlalte constrângeri privind tipul parametrului. clasa MyClassy<T, U> unde T : clasa unde U : struct
{
}
Propoziția 3.where poate include și constrângeri de constructor. Poți folosi noul operator pentru a crea o instanță a unui parametru de tip; Dar argumentul tipului trebuie să fie constrâns de constrângerea constructorului new() pentru aceasta. Constrângerea new() informează compilatorul că orice tip de argument furnizat trebuie să aibă un constructor accesibil, fără parametri (sau implicit). De exemplu: clasa publică <T> MyGenericClass unde T: IComparable, new()
{ Următoarea linie nu este posibilă fără noua constrângere(): Elementul T = noua T();
} Noua constrângere apare la sfârșitul clauzei where.
4. Pentru mai mulți parametri de tip, fiecare parametru de tip folosește o clauză where, De exemplu: interfaza MyI { } Dicționarul clasei<TKey, TVal> unde TKey: IComparabil, IEnumerabil unde TVal: MyI
{ public void Adaugă (TKey key, TVal val)
{
}
}
5. De asemenea, puteți atașa constrângeri parametrilor de tip ai metodelor generice, cum ar fi:
public bool <T>MyMethod(T t) unde T : IMyInterface { }
Rețineți că sintaxa pentru descrierea constrângerilor parametrilor de tip este aceeași atât pentru delegați, cât și pentru metode:
delegă T <T>MyDelegate() unde T : new()
Unde generic
Generic Where poate califica parametrii de tip. Există mai multe moduri.
·unde T : struct restricționează parametrul de tip pe care T trebuie să îl moștenească de la System.ValueType.
·unde clasa T: restricționează tipul Parametrul T trebuie să fie un tip de referință, adică nu poate fi moștenit de la System.ValueType.
unde T : new() restricționează parametrul de tip T trebuie să aibă un constructor implicit
·unde T : NameOfClass restricționează parametrul de tip T trebuie să moștenească de la o clasă sau să implementeze o interfață.
Aceste calificative pot fi combinate, cum ar fi: clasă publică Punct unde T : clasă, IComparabil, nou() |