c# - 为什么成员字段不能有字段初始值设定项调用成员函数?

标签 c# field member func

在 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/

相关文章:

java - 在子类中隐藏父类(super class)的字段

c++ - 这个指向非静态成员函数代码的指针不起作用的原因是什么?

c# - 如何在 C# 中动态创建 DataGridView?

c# - 在 C# 中实现 JS Eval

database - 将多个值字段拆分为数据库中的行的理想方法?

Java静态字段的使用

c++ - 无法使用访问器设置私有(private)静态成员变量

c# - 在 C# 中如何动态指定对象的成员,如 obj ["abc"] 在 PHP 中

使用 Azure AD 的 C# MVC Web 应用程序在失败之前随机开始重定向大约 10 次

c# - 什么使 Min(byte,int) 调用不明确?