为什么类字段不能是var?

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

我想编译器必须能够推导出成员variables的types,就像本地variables一样。 那有什么区别?

Eric Lippert在这里回答你的问题: 为什么在田野上不变?

基本上,对于一般情况下,它需要重新编写C#编译器,因为它当前的types推断方式不适用于var字段variables赋值的循环。

var关键字是为匿名typesdevise的,只能在方法内部使用。

另外,你错了; 编译器不能总是推导出一个var字段。

如果编译以下内容会发生什么情况:

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

这种情况是不可能用局部variables重新创build的,因为variables在定义之前不能被引用。

这里的一般问题是,你要求编译器消耗types信息, 而它仍然在生成这些信息
Eric Lippert更深入地解释道 。

我看到两个原因:

  1. 可能需要明确地在公共接口中声明types
  2. 这很难实现。 C#编译器分多个阶段编译。
    起初它parsing除了方法体之外的所有东西,所以它知道函数体外的所有东西。 然后它可以使用这些信息分别编译方法体。 编译一个方法体时会发生什么,对编译其他方法体时会发生什么影响不大。
    如果你可以使用var作为字段,则字段初始值设定项的expression式主体将会影响字段的types,从而影响许多其他的方法。 所以它不适合编译器devise。

但是对于一个

var a = SomeMethod();

编译器首先需要知道SomeMethod()的返回types,现在还不知道。

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

这是一个猜测,但类级字段的初始化必须作为Type的初始化(构造函数)进程的一部分来完成,而方法级别variables的初始化发生在构build方法的栈帧时。 也许这个区别与框架内这些过程是如何被编译(如何创build它们的实现)有关。