错误1:字段初始化器不能引用非静态字段、方法或属性

本文关键字:字段 静态 方法 属性 不能 初始化 错误 引用 | 更新日期: 2023-09-27 18:15:49

 public partial class Form1 : Form
  {
    Class1 class = new Class1(30,a);
    public Form1()
    {
        InitializeComponent();
    }
     public int a = 0;

    private void Timer1_Tick(object sender, EventArgs e)
    {
        a += 1;
    }
 }

我想在我的类中使用变量'a',但我不能通过构造函数将其"移动"到我的类。我收到的错误信息是:

错误:字段初始化器不能引用非静态字段、方法或属性。

我知道这是一个基本问题,但感谢帮助

 class Class1
  {

    private   int r;
    private   int x;
    public Construct(int p, int c)
    {
        this.r = p;
        this.x = c;
    }
  }

错误1:字段初始化器不能引用非静态字段、方法或属性

class1的初始化移到构造函数中:

class Form1 {
    int a = 0;
    Class1 obj1;
    public Form1() {
        obj1 = new Class1(a);
    }
}

不能初始化依赖于类的另一个字段的字段。

来自c#语言规范10.5.5:

字段声明可以包含变量初始化式。对于静态字段、变量初始化式对应于赋值语句在类初始化期间执行。例如字段,变量初始化式对应于赋值语句在创建类的实例时执行。

§10.5.4中描述的默认值初始化对所有发生字段,包括具有变量初始化项的字段。因此,当类初始化时,该类中的所有静态字段都是优先的初始化为它们的默认值,然后是静态字段初始化式按文本顺序执行。同样,当一个实例如果创建了一个类,那么该实例中的所有实例字段都是优先的初始化为它们的默认值,然后是实例字段初始化式按文本顺序执行。

所以,在你的代码中,a没有在class之前初始化,尽管我不认为编译器关心它是在字母顺序之前还是之后。它只是不允许你使用一个实例变量来初始化另一个。