class Poly
{
public static void WriteVal(int i) { System.Console.Write("{0}\n", i); }
public static void WriteVal(string s) { System.Console.Write("{0}\n", s); }
}
class GenWriter<T>
{
public static void Write(T x) { Poly.WriteVal(x); }
}
Почему метод невинных (для С++-программистов) Write не подходит для С#?
Вы можете видеть, что компилятор пытается сопоставить тип параметра T с конкретными перегрузками before:
Ошибка 3 Наилучшее перегруженное соответствие метода для 'TestGenericPolyMorph.Poly.WriteVal(int)' имеет некоторые недопустимые аргументы
Конечно. целью было не использовать статический метод, как указано выше, цель состоит в создании оболочки с полиморфным поведением. Примечание. Я использую VS 2010.
Обратите внимание, что вся необходимая информация доступна во время компиляции. Еще раз: проблема в том, что проверка выполняется до создания шаблона.
Добавление после обсуждения:
Ну, может быть, я не особо подчеркивал это. Речь шла не только о различии между дженериками и шаблонами, но и о решении следующей проблемы: данный набор перегрузок, адресующих разные типы, я хочу создать набор классов-оболочек, предоставляющих виртуальный метод (полиморфизм) для этих типов. Цена разрешения виртуальных методов во время выполнения минимальна и не влияет на производительность. Именно здесь были удобны шаблоны С++. Очевидно, что накладные расходы на разрешение типа рабочего времени для динамического существенно отличаются. Итак, вопрос заключается в том, можно ли преобразовать существующие перегрузки в полиморфизм без репликации кода и без уплаты штрафа за производительность (например, я не уверен, что я получаю с помощью динамического по сравнению с "переключателем", пытающимся вместо отличного синтаксиса).
Одним из решений, которые я видел до сих пор, было создание/испускание кода (sic!), то есть вместо вырезания и вставки, чтобы сделать это автоматически.
Итак, вместо обработки шаблонов С++ мы просто делаем это вручную или просто заново изобретаем макро/шаблонный процессор.
Что-нибудь лучше?