为什么成员字段的字段初始化程序调用成员函数?

时间:2014-10-17 20:50:44

标签: c# field member func

在MVC控制器中,我试图创建一个类似于:

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

这会导致编译错误

  

非静态字段,方法或者需要对象引用   property'System.Web.Mvc.Controller.View(string,object)'

此代码可以正常用作方法

private ViewResult ModelResult(MyModel model)
{
    return View("myview.cshtml", model);
}

如果字段由构造函数

初始化,它也可以正常工作
public MyController()
{
    ModelResult=(model) => View("myview.cshtml", model);
}

为什么将字段初始值设定项视为静态上下文?

1 个答案:

答案 0 :(得分:3)

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

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