Клауза where використовується для визначення обмежень типів, які можуть слугувати змінними для параметрів типу, визначених у загальних деклараціях. 1. Обмеження інтерфейсу. Наприклад, можна оголосити загальний клас MyGenericClass, щоб параметр типу T міг реалізувати<T> інтерфейс IComparable:
публічний клас<T> MyGenericClass, де T:IComparable { }
2. Обмеження базового класу: Означає, що тип повинен використовувати вказаний клас як базовий клас (або сам клас), який використовується як параметр типу для цього загального типу. Після використання такого обмеження воно має з'являтися перед усіма іншими обмеженнями типу параметра. клас MyClassy<T, U> де T : клас де U : struct
{
}
Клаузу 3.where також можуть містити обмеження конструктора. Ви можете використати новий оператор для створення екземпляра параметра типу; Але аргумент типу має бути обмежений конструкторським обмеженням new() для цього. Обмеження new() дає компілятору знати, що будь-який тип аргументу повинен мати доступний конструктор без параметрів (або за замовчуванням). Наприклад: публічний клас <T> MyGenerricClass, де T: IComparable, new()
{ Наступна лінія неможлива без обмеження new(): T item = новий T();
} Обмеження new() з'являється в кінці клаузи where (де).
4. Для кількох параметрів типу кожен параметр типу використовує клаузу where, Наприклад: interface MyI { } Класовий словник<ТКей, ТВал> де TKey: IComparable, IEnumerable де TVal: MyI
{ public void Add(TKey key, TVal val)
{
}
}
5. Також можна накладати обмеження на параметри типів загальних методів, наприклад:
публічний bool <T>MyMethod(T t), де T : IMyInterface { }
Зверніть увагу, що синтаксис для опису обмежень параметрів типу однаковий як для делегатів, так і для методів:
делегат T <T>MyDelegate(), де T : new()
Generic Where
Generic Where може кваліфікувати параметри типу. Існує кілька способів.
·де T : struct обмежує параметр типу, який T має успадкувати від System.ValueType.
·де T: клас обмежує тип Параметр T має бути еталонним типом, тобто його не можна успадкувати від System.ValueType.
де T : new() обмежує параметр типу T повинен мати конструктор за замовчуванням
·де T : NameOfClass обмежує параметр типу, який T повинен успадкувати від класу або реалізувати інтерфейс.
Ці кваліфікатори можна комбінувати, наприклад: публічний клас Точка, де T : клас, IComparable, new() |