Eu tenho um problema fundamental com o uso de var.
Neste exemplo, tudo fica lado a lado, mas o problema é realmente com grandes soluções com bibliotecas ou projetos compartilhados.
Considere isto:
public MyFirstObject GetMeAnObject() {
return new MyFirstObject();
}
public void MainProgram() {
var theObject = GetMeAnObject();
theObject.PerformOperation();
}
O que acontece se GetMeAnObject for alterado, por outra pessoa, para atender às suas necessidades?
public MySecondObject GetMeAnObject() {
return new MySecondObject();
}
O método MainProgram terá um grande erro vermelho em .PerformOperation (). O que aconteceu? PerformOperation funcionou perfeitamente bem antes. Observamos os métodos no objeto e ele simplesmente desapareceu sem deixar rasto. Foi lá da última vez, e precisamos desse método. Você pode gastar muito tempo perseguindo seu rabo e tentando descobrir por que, se MyFirstObject possui um método chamado PerformOperation, ele agora não pode ser visto. Todo mundo "sabe" que GetMeAnObject retorna um MyFirstObject, então não faz sentido verificar isso.
Se você tivesse digitado explicitamente theObject, teria um erro de Invalid Cast na linha que chama GetMeAnObject, e seria óbvio que GetMeAnObject está retornando um tipo que não é o que você espera.
Em resumo, declaração explícita significa que você sabe o que significam os erros. Uma conversão inválida significa que você esperava um tipo e outro tipo foi retornado. Um membro não reconhecido significa que o membro não foi reconhecido.
??
operador de coalescência nula depois de explicado, não deverá ser permitido perto do código de produção.