Клауза 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 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() |