4

以下 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' 不是静态的,类也不是,它们也不是静态构造函数。

4

3 回答 3

7

base(foo = 0)执行DerivedType类的时候还没有“创建”,所以它还不能访问它定义的成员。

事情发生的顺序是这样的

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

所以你看到你试图foo在第 2 步分配一个值,但foo直到第 6 步才会存在。

于 2013-07-10T00:51:54.177 回答
4

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

在构造其基本类型之前,您无法访问您的实例。

于 2013-07-10T00:36:46.493 回答
3

错误说这foo不是静态的,但只有类的静态成员和构造函数本身的参数可以用于调用基本构造函数(除了其他外部常量)。

你大概是说

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

准确地说,摘自 C# 文档:C# 5.0 规范的第 10.11.1 节“构造函数初始化器”。

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

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

但是不允许访问实例和实例字段:

实例构造函数初始化程序无法访问正在创建的实例。因此,在构造函数初始化程序的参数表达式中引用 this 是编译时错误,因为参数表达式通过简单名称引用任何实例成员也是编译时错误

于 2013-07-10T00:36:59.453 回答