Klauzula gdzie służy do określenia ograniczeń typu, które mogą służyć jako zmienne dla parametrów typów zdefiniowanych w deklaracjach ogólnych. 1. Ograniczenia interfejsu. Na przykład możesz zadeklarować klasę ogólną MyGenericClass, tak aby parametr typu T mógł zaimplementować interfejs IComparable<T>:
public class MyGenericClass<T>, gdzie T:IComparable { }
2. Ograniczenie klasy podstawowej: Oznacza, że typ musi użyć określonej klasy jako klasy bazowej (lub samej klasy), aby być użyta jako parametr typu dla tego typu. Po zastosowaniu takiego ograniczenia musi pojawić się przed wszystkimi innymi ograniczeniami dotyczącymi typu parametru. klasa MyClassy<T, U> gdzie T : klasa gdzie U : struct
{
}
Klauzula 3.gdzie może również zawierać ograniczenia konstruktora. Możesz użyć nowego operatora do stworzenia instancji parametru typu; Ale argument typu musi być ograniczony przez konstruktor new() dla tego powodu. Ograniczenie new() informuje kompilator, że każdy podany argument musi mieć dostępny konstruktor bez parametrów (lub domyślny). Na przykład: public class <T> MyGenericClass, gdzie T: IComparable, new()
{ Następująca linia nie jest możliwa bez ograniczenia new(): Element T = nowy T();
} Ograniczenie new() pojawia się na końcu klauzuli where.
4. Dla wielu parametrów typu każdy parametr typu używa klauzuli where, Na przykład: interfejs MyI { } Słownik klasowy<TKey, TVal> gdzie TKey: Porównywalny, IEnumerowalny gdzie TVal: MyI
{ public void Add(TKey key, TVal val)
{
}
}
5. Możesz także przypisać ograniczenia do parametrów typowych metod ogólnych, takich jak:
public bool MyMethod<T>(T t) gdzie T : IMyInterface { }
Należy zauważyć, że składnia opisu ograniczeń parametrów typu jest taka sama zarówno dla delegatów, jak i metod:
delegate T MyDelegate<T>(), gdzie T : new()
Ogólne gdzie
Ogólne Gdzie może kwalifikować parametry typu. Jest kilka sposobów.
·gdzie T : struct ogranicza parametr typu T musi odziedziczyć z System.ValueType.
·gdzie T: klasa ogranicza typ Parametr T musi być typem odniesienia, tzn. nie może być dziedziczony z System.ValueType.
gdzie T : new() ogranicza parametr typu T musi mieć domyślny konstruktor
·gdzie T : NameOfClass ogranicza parametr typu, który T musi odziedziczyć z klasy lub implementować interfejs.
Te kwalifikatory można łączyć, takie jak: public class Point where T : class, IComparable, new() |