Методы, параметры которых объявляются с помощью параметров типа, могут быть перегружены. Но правила их перегрузки упрощаются по сравнению с методами без параметров типа. Как правило, метод, в котором параметр типа служит для указания типа данных параметра этого метода, может быть перегружен при условии, что сигнатуры обоих его вариантов отличаются. Это означает, что оба варианта перегружаемого метода должны отличаться по типу или количеству их параметров. Но типовые различия должны определяться не по параметру обобщенного типа, а исходя из аргумента типа, подставляемого вместо параметра типа при конструировании объекта этого типа. Следовательно, метод с параметрами типа может быть перегружен таким образом, что он окажется пригодным не для всех возможных случаев, хотя и будет выглядеть верно.

В качестве примера рассмотрим следующий обобщенный класс.

// Пример неоднозначности, к которой может привести // перегрузка методов с параметрами типа.

//

// Этот код не подлежит компиляции, using System;

// Обобщенный класс, содержащий метод Set(), перегрузка // которого может привести к неоднозначности, class Gen {

Т obi;

V ob2 ;

// ...

// В некоторых случаях эти два метода не будут // отличаться своими параметрами типа, public void Set(T о) { obi = о;

}

public void Set(V о) {fob2 = o;

}

}

class AmbiguityDemo { static void Main() {

Gen ok = new Gencint, double>();

Gen notOK = new Gencint, int>();

ok.Set(10); // верно, поскольку аргументы типа отличаются

notOK.Set(10); // неоднозначно, поскольку аргументы ничем не отличаются!

}

}

Рассмотрим приведенный выше код более подробно. Прежде всего обратите внимание на то, что классGenобъявляется с двумя параметрами типа:ТиV.В классеGenметодSet() перегружается по параметрам типаТиV,как показано ниже.

public void Set (T о) { obi = о;

}

public void Set(V o) { ob2 = o;

}

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

При таком объявлении классаGenне соблюдается никаких требований к различению типовТиV.Например, нет ничего принципиально неправильного в том, что объект классаGenбудет сконструирован так, как показано ниже.

Gencint, int> notOK = new Gencint, int>();

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

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