Em modelos C ++, pode-se especificar que um determinado parâmetro de tipo é um padrão. Ou seja, a menos que especificado explicitamente, ele usará o tipo T.
Isso pode ser feito ou aproximado em C #?
Estou procurando algo como:
public class MyTemplate<T1, T2=string> {}
Para que uma instância do tipo que não especifica explicitamente T2
:
MyTemplate<int> t = new MyTemplate<int>();
Seria essencialmente:
MyTemplate<int, string> t = new MyTemplate<int, string>();
Em última análise, estou olhando para um caso em que há um modelo que é amplamente usado, mas estou pensando em expandir com um parâmetro de tipo adicional. Eu poderia fazer uma subclasse, eu acho, mas estava curioso se havia outras opções nessa linha.
overloadable
por contagem de parâmetro.Uma solução é a subclasse. Outro que eu usaria, são os métodos de fábrica (combinados com a palavra-chave var).
No exemplo acima
val2
é do tipoMyTemplate<int,string>
e não um tipo derivado dele.Um tipo
class MyStringTemplate<T>:MyTemplate<T,string>
não é igual aMyTemplate<T,string>
. Isso pode representar alguns problemas em determinados cenários. Por exemplo, você não pode lançar uma instância deMyTemplate<T,string>
paraMyStringTemplate<T>
.fonte
você também pode criar uma classe Overload como esta
fonte
MyTemplate<T1>
não é uma classe diferente deMyTemplate<T1, T2>
nenhuma delasAnotherTemplate<T1>
.MyTemplate<T1, string>
não pode ser atribuídoMyTemplate<T1>
, o que pode ser desejávelC # não oferece suporte a esse recurso.
Como você disse, você pode criar uma subclasse (se não estiver lacrada e duplicar todas as declarações do construtor), mas é uma coisa completamente diferente.
fonte
Infelizmente, C # não oferece suporte ao que você está tentando fazer. Seria um recurso difícil de implementar, dado que o tipo padrão de um parâmetro teria que aderir às restrições genéricas e provavelmente criaria dores de cabeça quando o CLR tentasse garantir a segurança do tipo.
fonte