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(); 
}
Foi útil?

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.

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