В этом объявлении операторwhereуведомляет компилятор о том, что аргумент типа, привязанный к параметру типа V, должен быть таким же, как и аргумент типа, привязанный к параметру типаТ,или же наследовать от него. Если подобная связь отсутствует при объявлении объекта типаGen,то во время компиляции возникнет ошибка. Такое ограничение на параметр типа называется
// Установить связь между двумя параметрами типа.
using System;
class А {
//...
}
class В : А {
// ...
}
// Здесь параметр типа V должен наследовать от параметра типа Т. class Gen
// ...
}
class NakedConstraintDemo { static void Main {
// Это объявление вполне допустимо, поскольку
// класс В наследует от класса А.
GerKA, В> х = new Gen ;
// А это объявление недопустимо, поскольку // класс А-.не наследует от класса В. .
// Gen у = new Gen;
}
}
Обратите внимание на то, что класс В наследует от класса А. Проанализируем далее оба объявления объектов класса Gen в методе Main . Как следует из комментария к первому объявлению
Gen х = new Gen ;
оно вполне допустимо, поскольку класс В наследует от класса А. Но второе объявление
// Gen у = new Gen;
недопустимо, поскольку класс А не наследует от класса В.
Применение нескольких ограничений
С параметром типа может быть связано несколько ограничений. В этом случае ограничения указываются списком через запятую. В этом списке первым должно быть указано ограничение class либо struct, если оно присутствует, или же ограничение на базовый класс, если оно накладывается. Указывать ограничения class или struct одновременно с ограничением на базовый класс rte разрешается. Далее по списку должно следовать ограничение на интерфейс, а последним по порядку — ограничение new . Например, следующее объявление считается вполне допустимым.
class Gen
// ...
В данном случае параметр типа Т должен быть заменен аргументом типа, наследующим от класса MyClass, реализующим интерфейс IMylnterface и использующим конструктор без параметра.
Если же в обобщении используются два или более параметра типа, то ограничения на каждый из них накладываются с помощью отдельного оператора where, как в приведенном ниже примере.
// Использовать несколько операторов where, using System;
// У класса Gen имеются два параметра типа, и на оба накладываются // ограничения с помощью отдельных операторов where, class Gen
where V : struct {
T obi;
V ob2;
public Gen(T t, V v) { obi = t;
ob2 = v;
}
}