Por que campos de class não podem ser var?

class A { A() { var x = 5; // this is allowed } var _x = 5; // the compiler is unhappy } 

Eu acho que o compilador deve ser capaz de deduzir o tipo para a variável de membro da mesma maneira que faz para o local. Então qual a diferença?

Eric Lippert respondeu à sua pergunta aqui: Por que não var nos campos?

Basicamente, para o caso geral, seria necessário rewrite o compilador C #, pois a maneira como ele atualmente faz a inferência de tipo não funcionaria para ciclos de atribuições de variável de campo var .

A palavra-chave var foi projetada para tipos anônimos, que só podem ser usados ​​dentro de um método.

Além disso, você está errado; o compilador nem sempre pode deduzir um campo var .

O que acontece se você compilar o seguinte:

 class A { public readonly var value = B.value; } class B { public readonly var value = B.value; } 

Essa situação é impossível de recriar com variables ​​locais, já que uma variável não pode ser referenciada antes de ser definida.

O problema geral aqui é que você está pedindo ao compilador para consumir informações de tipo enquanto ainda estiver gerando essas informações .
Eric Lippert explica em maior profundidade .

Eu vejo dois motivos:

  1. Pode ser desejável tornar explícita a declaração de tipos em uma interface pública
  2. É difícil de implementar. O compilador C # compila em várias fases.
    A princípio, ele analisa tudo, independentemente dos corpos dos methods, para que ele saiba tudo o que estiver fora dos corpos das funções. Em seguida, ele pode usar essas informações para compilar corpos de método individualmente. O que acontece ao compilar um corpo de método não tem muito efeito sobre o que acontece quando se compila outros corpos de método.
    Se você pudesse usar var para campos, o corpo da expressão do inicializador de campo afetaria o tipo do campo e, portanto, muitos outros methods. Portanto, não se encheckbox bem no design do compilador.

Mas para um

var a = SomeMethod ();

primeiro o compilador precisa saber o returntype do SomeMethod() e ele não sabe ainda neste momento.

Veja: http://blogs.msdn.com/b/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx

Isso é um palpite, mas a boot de campos de nível de class deve ser feita como parte do processo de boot (construtor) de um Type, enquanto a boot de uma variável de nível de método acontece quando o quadro de pilha do método é construído. Talvez a distinção esteja relacionada a como esses processos são compilados (como sua implementação é criada) dentro do framework.