【问题标题】:C# Cannot access non-static member field in static context, without actually being in static contextC#无法在静态上下文中访问非静态成员字段,而实际上并未处于静态上下文中
【发布时间】:2016-06-24 16:09:34
【问题描述】:

谁能解释我为什么会收到这个错误 “即使我不在静态上下文中,也无法在静态上下文中访问非静态字段 wtf。

我在“public int variable = wtf.queuePosition;”这一行得到错误

class Test
{

    public Test wtf = new Test();
    public int variable = wtf.queuePosition;

    private int queuePosition;
    public Test()
    {
        queuePosition = 5;
    }
}

【问题讨论】:

  • wtf 是 Test 类的一个实例——我已经展示了它的代码:)
  • 您不能从字段初始化程序中不同字段的值初始化一个字段。您需要将该代码移至构造函数。 “静态上下文”仅仅意味着你被禁止访问实例成员。
  • 字段初始值设定项静态上下文:您不能像在public int variable = wtf.queuePosition;中那样分配成员
  • 如果你想初始化变量,你必须在构造函数中进行(你到底想达到什么目的?)
  • static member != static context 并且正如 stuard 所评论的,字段初始化器(public int variable = wtf.queuePosition;)是一个静态上下文

标签: c# static


【解决方案1】:

虽然我不在静态环境中。

实例成员变量的初始化是在你的构造函数代码执行之前完成的。此时,仍然没有this 引用。

所以我担心你错了。从编译器的角度来看,您 处于静态上下文中。

来自C# specification (17.4.5.2 Instance field initialization)

实例字段的变量初始化器不能引用正在创建的实例。因此,引用是编译时错误 this 在变量初始化器中,因为变量初始化器通过简单名称引用任何实例成员是编译时错误。

【讨论】:

    【解决方案2】:

    您正在将变量分配给另一个变量中的属性值。您的变量 wtf 是非静态的,但是类中的变量分配是静态的。所以赋值“public int variable = wtf.queuePosition;”是在静态上下文中。

    您的示例中显示了不允许这样做的一个明显原因。您的代码很快就会出现堆栈溢出异常。由于每个 Test 实例都在更新另一个 Test 实例,这将更新另一个 ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2011-11-03
      • 2010-10-23
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多