class Gen where Т : MyClass, IMylnterface, new() {

// ...

В данном случае параметр типа Т должен быть заменен аргументом типа, наследующим от класса MyClass, реализующим интерфейс IMylnterface и использующим конструктор без параметра.

Если же в обобщении используются два или более параметра типа, то ограничения на каждый из них накладываются с помощью отдельного оператора where, как в приведенном ниже примере.

// Использовать несколько операторов where, using System;

// У класса Gen имеются два параметра типа, и на оба накладываются // ограничения с помощью отдельных операторов where, class Gen where T : class

where V : struct {

T obi;

V ob2;

public Gen(T t, V v) { obi = t;

ob2 = v;

}

}

class MultipleConstraintDemo { static void Main() {

// Эта строка кода вполне допустима, поскольку // string — это ссылочный тип, a int — тип значения.

Gen obj = new Gen(nTecTM, 11);

//А следующая строка кода недопустима, поскольку // bool не относится к ссылочному типу.

// Gencbool, int> obj = new Gencbool, int>(true, 11);

}

}

В данном примере класс Gen принимает два аргумента с ограничениями, накладываемыми с помощью отдельных операторов where. Обратите особое внимание на объявление этого класса.

class GenCT, V> where T : class

where V : struct {

Как видите, один оператор where отделяется от другого только пробелом. Другие знаки препинания между ними не нужны и даже недопустимы.

Получение значения, присваиваемого параметру типа по умолчанию

Как упоминалось выше, при написании обобщенного кода иногда важно провести различие между типами значений и ссылочными типами. Такая потребность возникает, в частности, в том случае, если переменной параметра типа должно быть присвоено значение по умолчанию. Для ссылочных типов значением по умолчанию является null, для неструктурных типов значений — 0 или логическое значение false, если это тип bool, а для структур типа struct — объект соответствующей структуры с полями, установленными по умолчанию. В этой связи возникает вопрос: какое значение следует присваивать по умолчанию переменной параметра типа: null, 0 или нечто другое? Например, если в следующем объявлении класса Test:

class Test {

Т obj;

П...

переменной obj требуется присвоить значение по умолчанию, то какой из двух вариантов

obj = null; // подходит только для ссылочных типовили

obj =0; // подходит только для числовых типов и // перечислений, но не для структур

следует выбрать? Для разрешения этой дилеммы можно воспользоваться еще одной формой оператора default, приведенной ниже.

default(тип)

Перейти на страницу:

Похожие книги