E quanto aos parâmetros de tipo genérico opcionais no C# 5.0?[fechado]

StackOverflow https://stackoverflow.com/questions/2541659

  •  23-09-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top