在 MVC Controller 内,我尝试创建一个类似于以下内容的字段:
Func<MyModel, ViewResult> ModelResult=(model) => View("myview.cshtml", model);
这会导致编译错误
An object reference is required for the non-static field, method, or 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);
}
为什么字段初始值设定项被视为静态上下文?
最佳答案
字段初始值设定项在构造函数之前运行,与构造函数的顺序相反。也就是说,它们从派生程度最高的类型一直到派生程度最低的类型,并且派生程度最低的类型的字段将在调用任何构造函数之前初始化。我们做出了一项设计决定,不允许在调用基类型的构造函数之前引用 this
,或者更一般地说,不允许从字段初始值设定项引用部分构造的实例。
我认为这是一个明智的决定。如果您不太熟悉该语言,那么字段初始值设定项运行时对象的状态不如构造函数运行时清晰。构造函数声明的流动方式反射(reflect)了调用构造函数的实际顺序,因此更容易推断状态。具体来说,: base()
调用出现在构造函数主体之前,这意味着在您进入主体时基本构造函数已经运行。您无法在字段声明站点轻松推断对象的状态,事实上,字段初始化顺序与 Java 不同,Java 可以说是 C# 引入时最相似的主流语言。
关于c# - 为什么成员字段不能有字段初始值设定项调用成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26433251/