在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);
}
为什么将字段初始值设定项视为静态上下文?
答案 0 :(得分:3)
字段初始化程序在构造函数之前运行,与构造函数的顺序相反。也就是说,它们从最派生类型运行到最少派生类型,并且在调用任何构造函数之前将初始化派生类型最少的字段。设计决策是在调用基类型的构造函数之前不允许引用this
,或者更一般地说,不允许从字段初始值设定项引用部分构造的实例。
我认为这是一个明智的决定。如果您不熟悉该语言,则字段初始化程序运行时对象的状态不如构造函数运行时清晰。构造函数声明流的方式反映了构造函数被调用的实际顺序,因此更容易推理状态。具体来说,: base()
调用出现在构造函数体之前,暗示基础构造函数已经在您进入正文时运行。您无法在字段声明站点轻松推断对象的状态,实际上字段初始化顺序与Java不同,Java可能是引入C#时最相似的主流语言。