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); }
}
¿Por qué el método inocente (para el programador C++) no es aceptable en C#?Polimorfismo, sobrecargas y genéricos en C#
Se puede ver que el compilador intenta hacer coincidir el tipo de parámetro T para sobrecargas concretas antes de instancias:
de error 3 El partido mejor método sobrecargado para 'TestGenericPolyMorph.Poly.WriteVal (int)' tiene algún argumentos inválidos
Por supuesto. el propósito no era usar el método estático como se indica anteriormente, la intención es crear un contenedor con comportamiento polimórfico. Nota: utilizo VS 2010.
Tenga en cuenta que toda la información necesaria está disponible en tiempo de compilación. Una vez más: el problema es que la validación se realiza antes de la instanciación de la plantilla.
adición después de la discusión:
Bueno, puede ser que no he insistido en este cabo correctamente. La pregunta no era solo acerca de la diferencia entre genéricos y plantillas, sino también sobre la solución del siguiente problema: dado un conjunto de sobrecargas que abordan diferentes tipos, quiero generar un conjunto de clases contenedoras que proporcionen método virtual (polimorfismo) para estos tipos. El precio de resolución de los métodos virtuales en tiempo de ejecución es mínimo y no afecta el rendimiento. Aquí es donde las plantillas de C++ son útiles. Obviamente, la sobrecarga de la resolución de tipo de tiempo de ejecución para dinámico es bastante diferente. Entonces, la pregunta es si se pueden convertir las sobrecargas existentes a polimorfismo sin replicar el código y sin pagar la penalización de rendimiento (p. Ej., No estoy seguro de lo que gano con dinámico en comparación con "cambiar" intentando fundir excepto de mejor sintaxis).
Una de las soluciones que he visto hasta ahora era generar/emitir código (sic!), Es decir, en lugar de cortar y pegar para hacerlo automáticamente.
Por lo tanto, en lugar del procesamiento de la plantilla de C++ simplemente lo hacemos manualmente o simplemente reinventamos el procesador de macro/plantilla.
¿Algo mejor?
"El problema es que la validación se realiza antes de la instanciación de la plantilla". - Si eso es verdad. No puede hacer eso en C# porque el compilador no sabe cuál es el tipo de x en tiempo de compilación. – TheBoyan
posible duplicado de [¿Cuáles son las diferencias entre los genéricos en C# y Java ... y las plantillas en C++?] (Http://stackoverflow.com/questions/31693/what-are-the-differences-between-generics-in -c-sharp-and-java-and-templates-i) –