Em uma pergunta StackExchange diferente, notei alguém usando este protótipo:
void DoSomething<T>(T arg) where T: SomeSpecificReferenceType
{
//Code....
}
Tendo em mente que existe apenas uma restrição de tipo único ( SomeSpecificReferenceType
), qual é a diferença e a vantagem de escrevê-lo assim, em vez de simplesmente:
void DoSomething(SomeSpecificReferenceType arg)
{
//Code....
}
Nos dois casos, arg
estará sujeito à verificação do tipo em tempo de compilação. Nos dois casos, o corpo do método pode confiar com segurança no conhecimento arg
de (ou descendente de) um tipo específico conhecido no momento da compilação.
É este o caso de um desenvolvedor superzeloz que aprende sobre genéricos antes de aprender sobre herança comum? Ou existe uma razão legítima para que uma assinatura de método seja escrita dessa maneira?
Respostas:
Sim, provavelmente é.
Talvez . Geralmente, faria mais sentido se houvesse um valor de retorno envolvido
T
ou outro parâmetro usadoT
.Mas, é possível que as partes internas do código usem
T
(talvez como argumento para um serializador?) E precisem usar especificamenteT
e não a classe de restrição. Ocasionalmente, você verá que quando a restrição é uma interface emparelhada com anew
restrição e a coragem do método criaT
s por algum motivo.Portanto, embora seja raro ver a versão de restrição necessária, há alguns momentos em que é. E é sempre possível que o método utilizado para precisar dele, mas agora não faz e o desenvolvedor deixou-o como é não introduzir uma alteração de quebra.
fonte
Acho que me lembro de ter digitado uma resposta contendo isso.
Naquele momento, o motivo era o seguinte:
(O código pode ser diferente. Apenas para ilustrar um dos possíveis motivos pelos quais há uma restrição no parâmetro type em um método genérico).
Basicamente, o código entra nas próprias manipulações de tipo de codificação manualmente. Também pode ser misturado com algumas coisas de reflexão.
Por exemplo, usando
Method<T>(T arg) where T : ...
, pode-se substituirarg.GetType()
portypeof(T)
. No entanto, não sei se essa escolha é boa ou ruim.Acho que esse é apenas um exemplo do autor (possivelmente eu ou outra pessoa) que não pensa cuidadosamente em todas as possibilidades de codificação, ao mesmo tempo em que se concentra demais em uma questão / questão diferente.
fonte