En las plantillas de C ++, se puede especificar que un determinado parámetro de tipo sea predeterminado. Es decir, a menos que se especifique explícitamente, utilizará el tipo T.
¿Se puede hacer esto o aproximarlo en C #?
Estoy buscando algo como:
public class MyTemplate<T1, T2=string> {}
De modo que una instancia del tipo que no especifica explícitamente T2
:
MyTemplate<int> t = new MyTemplate<int>();
Sería esencialmente:
MyTemplate<int, string> t = new MyTemplate<int, string>();
En última instancia, estoy viendo un caso en el que hay una plantilla que se usa bastante ampliamente, pero estoy considerando expandirme con un parámetro de tipo adicional. Podría subclase, supongo, pero tenía curiosidad por saber si había otras opciones en este sentido.
overloadable
por recuento de parámetros.Una solución es la subclasificación. Otro que usaría en su lugar son los métodos de fábrica (combinados con la palabra clave var).
En el ejemplo anterior
val2
es de tipoMyTemplate<int,string>
y no derivado de él.Un tipo
class MyStringTemplate<T>:MyTemplate<T,string>
no es del mismo tipo queMyTemplate<T,string>
. Esto podría plantear algunos problemas en determinados escenarios. Por ejemplo, no puedes lanzar una instancia deMyTemplate<T,string>
toMyStringTemplate<T>
.fuente
también puedes crear una clase Overload así
fuente
MyTemplate<T1>
es una clase diferente deMyTemplate<T1, T2>
ningunaAnotherTemplate<T1>
.MyTemplate<T1, string>
no se puede asignar aMyTemplate<T1>
, lo que puede ser deseableC # no admite dicha función.
Como dijiste, puedes subclasificarlo (si no está sellado y duplicar todas las declaraciones del constructor) pero es algo completamente diferente.
fuente
Desafortunadamente, C # no es compatible con lo que está intentando hacer. Sería una característica difícil de implementar dado que el tipo predeterminado para un parámetro tendría que adherirse a las restricciones genéricas y probablemente crearía dolores de cabeza cuando el CLR intentara garantizar la seguridad de tipos.
fuente