Полиморфизм, перегрузки и обобщения в C #

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); }
    }

Почему невинный (для программиста на C ++) метод Write неприемлем в C #?

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

Ошибка 3 Лучшее совпадение перегруженного метода для 'TestGenericPolyMorph.Poly.WriteVal (int)' имеет некоторые недопустимые аргументы

Конечно. цель заключалась не в использовании статического метода, как указано выше, а в создании оболочки с полиморфным поведением. Примечание: я использую VS 2010.

Обратите внимание, что вся необходимая информация доступна во время компиляции. Еще раз: проблема в том, что проверка выполняется до создания экземпляра шаблона.

Дополнение после обсуждения:

Ну, может быть, я не особо подчеркнул это. Речь шла не только о разнице между дженериками и шаблонами, но и о решении следующей проблемы: учитывая набор перегрузок, обращающихся к разным типам, я хочу сгенерировать набор классов-оболочек, предоставляющих виртуальный метод (полиморфизм) для этих типов. Цена разрешения виртуальных методов во время выполнения минимальна и не влияет на производительность. Вот где пригодились шаблоны C ++. Очевидно, накладные расходы на разрешение типа времени выполнения для динамического совсем другие.Итак, вопрос в том, можно ли преобразовать существующие перегрузки в полиморфизм без репликации кода и без потери производительности (например, я не уверен, что я получаю с динамическим по сравнению с «переключением», пытающимся преобразовать кроме лучшего синтаксиса).

Одно из решений, которое я видел до сих пор, заключалось в генерации / выдаче кода (sic!), То есть вместо автоматического вырезания и вставки.

Итак, вместо обработки шаблонов C ++ мы просто делаем это вручную или заново изобретаем процессор макросов / шаблонов.

Что-нибудь получше?

12
задан Yuri S. 1 January 2012 в 11:09
поделиться