¿Por qué los campos de clase no pueden ser var?

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

Supongo que el comstackdor debe poder deducir el tipo para la variable miembro de la misma forma que lo hace para la variable local. Entonces, ¿cuál es la diferencia?

Eric Lippert respondió su pregunta aquí: ¿Por qué no var on fields?

Básicamente, para el caso general, sería necesario volver a escribir el comstackdor de C #, ya que la forma en que actualmente realiza la inferencia de tipo no funcionaría para los ciclos de asignaciones de variable de campo var .

La palabra clave var se diseñó para tipos anónimos, que solo se pueden usar dentro de un método.

Además, estás equivocado; el comstackdor no siempre puede deducir un campo var .

Qué sucede si comstacks lo siguiente:

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

Esta situación es imposible de recrear con variables locales, ya que no se puede hacer referencia a una variable antes de su definición.

El problema general aquí es que le está pidiendo al comstackdor que consum información de tipo mientras aún está generando esa información .
Eric Lippert explica en mayor profundidad .

Veo dos razones:

  1. Podría ser deseable hacer explícita la statement de tipos en una interfaz pública
  2. Es difícil de implementar El comstackdor C # comstack en múltiples fases.
    Al principio, analiza todo, aparte de los cuerpos de métodos, para que sepa todo lo que está fuera de los cuerpos funcionales. Luego puede usar esa información para comstackr cuerpos de métodos individualmente. Lo que sucede al comstackr un cuerpo de método no tiene mucho efecto en lo que sucede al comstackr otros cuerpos de método.
    Si pudieras usar var para los campos, el cuerpo de expresión del inicializador de campo afectaría el tipo del campo y, por lo tanto, muchos otros métodos. Por lo tanto, no encaja bien en el diseño del comstackdor.

Pero por un

var a = SomeMethod ();

el comstackdor primero necesita saber el retornante del SomeMethod() y aún no lo sabe en este momento.

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

Esto es una suposición, pero la inicialización de los campos de nivel de clase debe realizarse como parte del proceso de inicialización (constructor) para un Tipo, mientras que la inicialización de una variable de nivel de método ocurre cuando se construye el marco de stack del método. Quizás la distinción se relaciona con la forma en que se comstackn estos procesos (cómo se crea su implementación) dentro del marco.