E quanto aos parâmetros de tipo genérico opcionais no C# 5.0?[fechado]
Pergunta
Apenas um pensamento.
Não seria útil ter parâmetros de tipo opcionais em C#?
Isso tornaria a vida mais simples.Estou cansado de ter várias classes com o mesmo nome, mas com parâmetros de tipo diferentes.Além disso, o VS não suporta esse mesmo vel (nomes de arquivos) :-)
Isso eliminaria, por exemplo, a necessidade de um IEnumerable não genérico:
interface IEnumerable<out T=object>{
IEnumerator<T> GetEnumerator()
}
O que você acha?
Solução
Eu estou definitivamente para isso.
Atualmente, estou escrevendo métodos auxiliares para diferentes cenários em que quero passar referências a diferentes membros e métodos de classes. Para conseguir isso, estou tomando, por exemplo, um Expression<Func<TIn, TOut>>
Como argumento para o ajudante (que me permite alcançar o método com uma expressão de lambda, mantendo tudo datilografado fortemente).
Mas - atualmente preciso definir um novo método auxiliar para cada número diferente de argumentos de entrada, pois preciso ter uma quantidade diferente de argumentos genéricos. Ao invés de
HelperMethod<TIn>(Expression<Action<TIn>> arg) // Yes, C# can distinguish
HelperMethod<TOut>(Expression<Func<TOut>> arg) // these two from eachother
HelperMethod<TIn, TOut>(Expression<Func<TIn, TOut>> arg)
HelperMethod<TIn1, TIn2, TOut>(Expression<Func<TIn1, TIn2, TOut>> arg)
// etc
Eu poderia me contentar com, no máximo, dois métodos:
HelperMethod<TIn>(Expression<Action<TIn>> arg)
HelperMethod<TOut, TIn1 = DummyType, ...>(Expression<Func<TIn1, ..., TOut> arg)
No meu caso, evitaria muita duplicação de código ...
Outras dicas
Qual seria o principal uso para esse recurso de idioma? Eu posso ver que isso poderia ajudar com algumas tarefas administrativas, como nomes de arquivos e menos digitação, mas além disso, não vejo o quão útil isso seria.
Além disso, esse recurso complicaria significativamente quaisquer restrições genéricas que pudessem ser colocadas no parâmetro do tipo genérico e o próprio tipo padrão teria que funcionar como uma espécie de restrição genérica em si.
Eu acho que isso complicaria o idioma sem oferecer nenhum benefício real ao desenvolvedor.
Não está claro para mim o que exatamente você está propondo.Atualmente pode haver tipos com o mesmo nome, mas com parâmetros de tipo diferentes, mas que não estão relacionados de forma alguma por herança - o que sua proposta faria então?
Além disso, se a biblioteca de classes base fosse redesenhada do zero, quase certamente não haveria nenhuma interface IEnumerable não genérica - ela só existe porque o CLR não suportava genéricos quando a interface foi introduzida, e a interface genérica herda dela apenas para que o código legado continue funcionando.Classes recém-declaradas estão sendo criadas para um CLR que suporta genéricos, portanto esse problema não é mais relevante.
Recentemente, me deparei com um caso que poderia ter usado algo assim, mas não exatamente. Eu tinha um método que executa uma espécie de transformação, entre a classe A e sua classe ACHILD e Classe B e Classe BCHILL. Geralmente, o par A/Achild era o mesmo que B/Bchild, mas às vezes A era uma classe base de B e Achild uma classe base de bchild.
Teria sido bom poder dizer que meu parâmetro de tipo TB não fez o TA e que o TBCHILD deixou o Tachild.
Observe que essa era uma situação em que era necessário escrever os parâmetros de tipo, pois a inferência não funcionaria.