К типу Т относится System.Int32 К типу V относится System.String Значение: 119
Значение: Альфа Бета Гамма
Обратите внимание на то, как объявляется классTwoGen.
class TwoGenCT, V> {
В этом объявлении указываются два параметра типаТиV,разделенные запятой. А поскольку у классаTwoGenдва параметра типа, то при создании объекта этого класса необходимо указывать два соответствующих аргумента типа, как показано ниже.
TwoGenCint, string> tgObj =
new TwoGenCint, string>(119, "Альфа Бета Гамма");
В данном случае вместоТподставляется типint,а вместоV— типstring.
В представленном выше примере указываются аргументы разного типа, но они могут быть и одного типа. Например, следующая строка кода считается вполне допустимой.
TwoGencstring, string> х =
new TwoGencstring, string>("Hello", "Goodbye");
В этом случае оба типа,ТиV,заменяются одним и тем же типом,string.Ясно, что если бы аргументы были одного и того же типа, то два параметра типа бьГли бы не нужны.
Общая форма обобщенного класса
Синтаксис обобщений, представленных в предыдущих примерах, может быть сведен к общей форме. Ниже приведена общая форма объявления обобщенного класса.
class
А вот как выглядит синтаксис объявления ссылки на обобщенный класс.
new
Ограниченные типы
В предыдущих примерах параметры типа можно было заменить любым типом данных. Например, в следующей строке кода объявляется любой тип, обозначаемый какТ.
class Gen
Это означает, что вполне допустимо создавать объекты классаGen,в которых типТзаменяется типомint, double, string, FileStreamили любым другим типом данных. Во многих случаях отсутствие ограничений на указание аргументов типа считается вполне приемлемым, но иногда оказывается полезно ограничить круг типов, которые могут быть указаны в качестве аргумента типа.
Допустим, что требуется создать метод, оперирующий содержимым потока, включая объекты типаFileStreamилиMemoryStream.На первый взгляд, такая ситуация идеально подходит для применения обобщений, но при этом нужно каким-то образом гарантировать, что в качестве аргументов типа будут использованы только типы потоков, но неintили любой другой тип. Кроме того, необходимо как-то уведомить компилятор о том, что методы, определяемые в классе потока, будут доступны для применения. Так, в обобщенном коде должно быть каким-то образом известно, что в нем может быть вызван методRead .