2014-10-17 55 views
2

里面一个MVC控制器I试图创建类似于字段:为什么成员字段不能有字段初始值设定项调用成员函数?

Func<MyModel, ViewResult> ModelResult=(model) => View("myview.cshtml", model); 

这导致编译错误

一个对象引用是所必需的非静态字段,方法或 属性 'System.Web.Mvc.Controller.View(字符串,对象)'

此代码工作正常为方法

private ViewResult ModelResult(MyModel model) 
{ 
    return View("myview.cshtml", model); 
} 
如果该字段由构造

public MyController() 
{ 
    ModelResult=(model) => View("myview.cshtml", model); 
} 

为什么字段初始当作一个静态初始化的背景下它

也能正常工作?

+0

很好的问题,这很奇怪为什么lambda调用实例方法不允许在字段初始化。我猜你可以找到帮助[这里](http://stackoverflow.com/a/17030381/1283124) – 2014-10-17 21:01:10

+0

[为什么C#lamba表达式不能使用实例属性和字段?](http:// stackoverflow。 COM /问题/ 17030351 /为什么-C-尖锐兰巴表达-斜面使用实例的属性和字段) – 2014-10-17 21:05:24

回答

3

字段初始值设定项在构造函数之前运行,按照构造函数的相反顺序。也就是说,它们从派生类型最多的派生类型运行到最小派生类型,并且在调用任何构造函数之前,最小派生类型的字段将被初始化。在调用基类型的构造函数之前,或者更一般地说,不允许this在设计决定中允许引用来自字段初始值设定项的部分构造实例。

我认为这是一个明智的决定。如果您不熟悉该语言,则字段初始化器运行时的对象状态不如构造器运行时清晰。构造函数声明流动的方式反映了构造函数被调用的实际顺序,因此更容易推理状态。具体来说,: base()调用出现在构造函数体之前,这意味着基础构造函数在输入正文时已经运行。你不能在字段声明站点轻松地推断出对象的状态,事实上,字段初始化顺序与Java不同,Java在引入C#时被认为是最相似的主流语言。

相关问题