Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Конспект лекций (C#).pdf
Скачиваний:
864
Добавлен:
27.05.2015
Размер:
2.03 Mб
Скачать

Например для двух классов A и B

Class A { ... }

Class B : A { ... }

и указанного выше универсального типа MyClass, рассмотрим следующие описания переменных и создания объектов:

MyClass<A, B> cl1 = new MyClass<A, B>(); // Допустимо MyClass<A, A> cl2 = new MyClass<A, A>(); // Допустимо MyClass<B, A> cl3 = new MyClass<B, A>(); // Не допустимо MyClass<B, B> cl3 = new MyClass<B, B>(); // Допустимо

7.3 Параметры типы в методах

Универсальность может применяться не только в универсальных типах, но и в отдельных методах, в т.ч. в обычных классов. В этом случае после имени метода указывается параметр типа (или параметры), который может быть использован в параметрах метода и в теле реализации метода.

Пример: создать класс, метод которого позволяет заменить все вхождения искомого значения на заданное.

class MyClass

{

public static void Replace<T>(T[] Mas, T Old, T New)

{

for (int i = 0; i < Mas.Length; i++) if (Mas[i].Equals(Old))

Mas[i] = New;

}

}

int[] IntMas = { 1, 2, 1, 3, 4, 1 };

MyClass.Replace(IntMas, 1, 5); // IntMas = {5, 2, 5, 3, 4, 5} string[] StrMas = { "один", "два", "один" };

MyClass.Replace(StrMas, "один", "три");

// StrMas = {"три", "два", "три"}

Как видно из примера, при вызове такого метода указывать фактический тип данных не требуется, компилятор его распознает автоматически. Если компилятор не может распознать тип данных, то формируется ошибка компиляции. Например, в следующей строке невозможно распознать тип <T>, т.к. на основе массива он должен быть int, а на основе параметра Old double:

MyClass.Replace(IntMas, 1.0, 5.0); // Ошибка компиляции

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

107