Обобщенный класс с двумя параметрами типа

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

// Простой обобщенный класс с двумя параметрами типа Т и V.

using System;

class TwoGen<T, V> {

  T ob1;

  V ob2;

  // Обратите внимание на то, что в этом конструкторе

  // указываются параметры типа Т и V.

  public TwoGen(T o1, V o2) {

    ob1 = o1;

    ob2 = o2;

  }

  // Показать типы Т и V.

  public void showTypes() {

    Console.WriteLine("К типу T относится " + typeof(T));

    Console.WriteLine("К типу V относится " + typeof(V));

  }

  public T getob1() {

    return ob1;

  }

  public V GetObj2() {

    return ob2;

  }

}

// Продемонстрировать применение обобщенного

// класса с двумя параметрами типа,

class SimpGen {

  static void Main() {

    TwoGen<int, string> tgObj =

                new TwoGen<int, string>(119, "Альфа Бета Гамма");

    // Показать типы.

    tgObj.showTypes();

    // Получить и вывести значения,

    int v = tgObj.getob1();

    Console.WriteLine("Значение: " + v);

    string str = tgObj.GetObj2();

    Console.WriteLine("Значение: " + str);

  }

}

Эта программа дает следующий результат.

К типу Т относится System.Int32

К типу V относится System.String

Значение: 119

Значение: Альфа Бета Гамма

Обратите внимание на то, как объявляется класс TwoGen.

class TwoGen<T, V> {

В этом объявлении указываются два параметра типа Т и V, разделенные запятой. А поскольку у класса TwoGen два параметра типа, то при создании объекта этого класса необходимо указывать два соответствующих аргумента типа, как показано ниже.

TwoGen<int, string> tgObj =

        new TwoGen<int, string>(119, "Альфа Бета Гамма");

В данном случае вместо Т подставляется тип int, а вместо V — тип string.

В представленном выше примере указываются аргументы разного типа, но они могут быть и одного типа. Например, следующая строка кода считается вполне допустимой.

TwoGen<string, string> х =

new TwoGen<string, string>("Hello", "Goodbye");

В этом случае оба типа, Т и V, заменяются одним и тем же типом, string. Ясно, что если бы аргументы были одного и того же типа, то два параметра типа были бы не нужны.