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 (). Как следует из комментария к первому

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату