为什么类字段不能是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更深入地解释道 。
我看到两个原因:
- 可能需要明确地在公共接口中声明types
- 这很难实现。 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它们的实现)有关。