Клаузата where се използва за задаване на типови ограничения, които могат да служат като променливи за типови параметри, дефинирани в общи декларации. 1. Ограничения на интерфейса. Например, можете да декларирате генеричен клас MyGenericClass, така че типовият параметър T да реализира<T> IComparable интерфейса:
публичен клас<T> MyGenerricClass, където T:IComparable { }
2. Ограничение за базов клас: Показва, че типът трябва да използва посочения клас като базов клас (или самия клас), който да се използва като параметър на типа за този общ тип. След като такова ограничение бъде използвано, то трябва да се появи преди всички останали ограничения върху типа параметър. клас MyClassy<T, U> където T : клас където U : struct
{
}
Клаузата 3.where може също да включва конструкторски ограничения. Можете да използвате новия оператор, за да създадете инстанция на тип параметър; Но аргументът тип трябва да бъде ограничен от конструкторското ограничение new() за това. Ограничението new() информира компилатора, че всеки вид предоставен аргумент трябва да има достъпен конструктор без параметър (или по подразбиране). Например: публичен клас <T> MyGenerricClass, където T: IComparable, new()
{ Следният ред не е възможен без ограничение new(): T елемент = нов T();
} Ограничението new() се появява в края на клаузата "where".
4. За множество типови параметри всеки тип параметър използва клауза where Например: interface MyI { } класов речник<TKey, TVal> където TKey: IComparable, IEnumerable където TVal: MyI
{ Public void Add(TKey ключ, TVal val)
{
}
}
5. Можете също да приложите ограничения към типови параметри на общи методи, като:
публичен bool <T>MyMethod(T t), където T : IMyInterface { }
Обърнете внимание, че синтаксисът за описание на ограниченията на типовите параметри е еднакъв както за делегатите, така и за методите:
делегат T <T>MyDelegate(), където T : new()
Генеричен Където
Generic Where може да квалифицира типови параметри. Има няколко начина.
·където T : struct ограничава типовия параметър, който T трябва да наследи от System.ValueType.
·където T: клас ограничава типа Параметърът T трябва да бъде референтен тип, тоест не може да бъде наследен от System.ValueType.
където T : new() ограничава типа параметър T трябва да има стандартен конструктор
·където T : NameOfClass ограничава типовия параметър, който T трябва да наследи от клас или да реализира интерфейс.
Тези квалификатори могат да се комбинират, като: публичен клас Точка, където T : клас, IComparable, new() |