关于基构造函数调用,什么是静态的

本文关键字:静态 什么 于基构 函数调用 | 更新日期: 2023-09-27 18:21:48

以下C#代码不编译。

public class BaseType
{
    public BaseType(int bar)
    {
        // Do stuff with bar...
    }
}
public class DerivedType : BaseType
{
    private int foo;
    public DerivedType() : base(foo = 0) {}
}

该错误发生在对DerivedType的基构造函数的调用上,消息为"无法访问静态上下文中的非静态字段‘foo’。"此错误消息告诉我什么foo和类都不是静态的,它们也不是静态构造函数。

关于基构造函数调用,什么是静态的

base(foo = 0)执行时,DerivedType类尚未"创建",因此它还不能访问它定义的成员。

事情发生的顺序就像这个

  1. 用户呼叫new DerivedType()
  2. 该代码调用DerivedType的base(foo = 0)
  3. 该代码调用BaseType的隐式base()Object()
  4. Object中的任何字段分配内存,然后运行Object()构造函数直至完成
  5. BaseType中的任何字段分配内存,然后运行BaseType(int bar)构造函数直至完成
  6. DerivedType中的任何字段分配内存,然后运行DerivedType()构造函数直至完成

因此,您可以看到,您正试图在步骤2为foo分配一个值,但foo要到步骤6才能存在。

问题是构造函数还没有运行。

在构造实例的基类型之前,不能访问实例。

错误表明foo不是静态的,但只有类的静态成员和构造函数本身的参数才能用于调用基构造函数(以及其他外部常量)。

你可能是指

public DerivedType() : base(0) {
   foo = 0;       
}

更确切地说,摘录自C#文档:C#5.0规范的10.11.1节"构造函数初始化器"。

允许访问构造函数本身的参数:

实例构造函数声明的形式参数列表所给定的参数的范围包括该声明的构造函数初始值设定项。因此,构造函数初始值设定项被允许访问构造函数的参数。

但不允许访问实例,因此也不允许访问示例字段:

实例构造函数初始值设定项无法访问正在创建的实例。因此,在构造函数初始值设定项的参数表达式中引用它是一个编译时错误,就像参数表达式通过简单名称引用任何实例成员一样