Digitação implícita;por que apenas as variáveis locais?
-
05-07-2019 - |
Pergunta
Alguém sabe ou cuidados para especular o porquê de digitação implícita, está limitada a variáveis locais?
var thingy = new Foo();
Mas por que não...
var getFoo() {
return new Foo();
}
Solução
Eric Lippert fez todo um post no blog sobre o assunto.
Em resumo, o principal problema é que ele teria exigido uma grande re-arquitetura do compilador do C# para fazer isso.Declarações são processadas em um único passe maneira.Isso exigiria várias passagens devido a capacidade de formar ciclos entre variáveis inferidas.VB.net tem aproximadamente o mesmo problema.
Outras dicas
Jared tem uma fantástica link na sua resposta, a um fantástico tópico.
Eu acho que ele não responde a pergunta de forma explícita.
Por que não?
var getFoo() {
return new Foo();
}
A razão para isto é:
O que se?
class Foo {}
var GetFoo() {
return GetBar();
}
var GetBar() {
return GetBaz();
}
var GetBaz() {
return new Foo();
}
Você poderia deduzir que GetFoo
vai voltar Foo
, mas você vai ter que rastrear através de todos as chamadas de método que faz e a sua crianças faz apenas para inferir o tipo.Como está o compilador C# não é projetado para funcionar desta forma.Ele precisa de método e tipos de campo no início do processo antes do código que infere tipos podem executar.
Em um puramente estética eu encontrar o var definições de métodos de confundir as coisas.Um lugar onde eu acho que ser explícito sempre ajuda-o, protege-lo de gravar o seu próprio pé acidentalmente por retornar um tipo que faz com que a sua assinatura e uma tonelada de outros dependentes assinaturas de método para a mudança.Pior ainda, você poderia mudar tudo o que você assinaturas de um método de cadeia, mesmo sem saber o que você fez então, se você retornar o valor de um método que devolve o objecto e aconteceu de ser feliz.
Eu acho var métodos são melhores para a esquerda para linguagens dinâmicas como Ruby
Porque é muito fácil de fazer.Se você fosse para inferência de todos os tipos, seria preciso algo como Hindley Milner tipo de inferência do sistema que irá efectuar o seu amado C# em Haskel derivados de linguagem.
Essencialmente, o problema que você está executando é que o C# (até agora) é uma linguagem de tipo estático.Uma variável local definido como var ainda é estaticamente tipada, mas sintaticamente oculto.Um método devolver var, por outro lado, tem muitas implicações.Torna-se mais de uma interface para uso, e você não ganhar nada, usando var.
você pode usar no vs 2010 Dinâmica
Dynamic getFoo() {
return new Foo();
}
Eu acho que é porque o escopo do que implícita de tipo é muito mais amplo e, portanto, mais susceptível de causar problemas de dentro do escopo de um único método.