class Test<T> where T : struct {
T obj;
public Test(T x) { obj = x;
}
// ...
}
class ValueConstraintDemo { static void Main() {
// Оба следующих объявления вполне допустимы.
Test<MyStruct> х = new Test<MyStruct>(new MyStruct ());
Test<int> у = new Test<int>(10);
//А следующее объявление недопустимо!
// Test<MyClass> z = new Test<MyClass>(new MyClass());
}
}
В этом примере кода класс Test объявляется следующим образом.
class Test<T> where Т : struct {
На параметр типа Т в классе Test накладывается ограничение struct, и поэтому к нему могут быть привязаны только аргументы типа значения. Это означает, что объявления Test<MyStruct>,n Test<int> вполне допустимы, тогда как объявление Test<MyClass> недопустимо. Для того чтобы убедиться в этом, удалите символы комментария в начале последней строки приведенного выше кода и перекомпилируйте его. В итоге вы получите сообщение об ошибке во время компиляции.
Установление связи между двумя параметрами типа с помощью ограничения
Существует разновидность ограничения на базовый класс, позволяющая установить связь между двумя параметрами типа. В качестве примера рассмотрим следующее объявление обобщенного класса.
class Gen<T/ V> where V : T {
В этом объявлении оператор where уведомляет компилятор о том, что аргумент типа, привязанный к параметру типа V, должен быть таким же, как и аргумент типа, привязанный к параметру типа Т, или же наследовать от него. Если подобная связь отсутствует при объявлении объекта типа Gen, то во время компиляции возникнет ошибка. Такое ограничение на параметр типа называется
// Установить связь между двумя параметрами типа.
using System;
class А {
//...
}
class В : А {
// ...
}
// Здесь параметр типа V должен наследовать от параметра типа Т. class Gen<T, V> where V : T {
// ...
}
class NakedConstraintDemo { static void Main() {
// Это объявление вполне допустимо, поскольку
// класс В наследует от класса А.
GerKA, В> х = new Gen<A, В> () ;
// А это объявление недопустимо, поскольку // класс А-.не наследует от класса В. .
// Gen<B, А> у = new Gen<B, А>();
}
}
Обратите внимание на то, что класс В наследует от класса А. Проанализируем далее оба объявления объектов класса Gen в методе Main (). Как следует из комментария к первому
