C# 错误 ;1和x9;字段初始值设定项不能引用非静态字段、方法或属性

C# 错误 ;1和x9;字段初始值设定项不能引用非静态字段、方法或属性,c#,constructor,C#,Constructor,我想在Cals中使用变量“a”,但我无法通过正在使用的构造函数将其“移动”到我的类中。 我收到的错误消息是: 错误:字段初始值设定项无法引用非静态字段、方法或属性 我知道这是一个基本问题,但我们非常感谢您的帮助 public partial class Form1 : Form { Class1 class = new Class1(30,a); public Form1() { InitializeComponent(); }

我想在Cals中使用变量“a”,但我无法通过正在使用的构造函数将其“移动”到我的类中。 我收到的错误消息是:

错误:字段初始值设定项无法引用非静态字段、方法或属性

我知道这是一个基本问题,但我们非常感谢您的帮助

 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;
    }
 }

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

 class Class1
  {


    private   int r;
    private   int x;

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

  }

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

 class Class1
  {


    private   int r;
    private   int x;

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

  }

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

从第10.5.5节:

字段声明可能包括变量初始值设定项。对于静态 字段、变量初始值设定项对应于 在类初始化期间执行。例如字段, 变量初始值设定项对应于 在创建类的实例时执行

§10.5.4中描述的默认值初始化适用于所有 字段,包括具有变量初始值设定项的字段。因此,当 类初始化时,该类中的所有静态字段都是第一个 初始化为默认值,然后是静态字段 初始值设定项按文本顺序执行。同样,当一个实例 创建一个类时,该实例中的所有实例字段都是第一个 初始化为其默认值,然后是实例字段 初始值设定项按文本顺序执行


因此,在您的代码中,
a
不会在
之前初始化,尽管我认为编译器并不关心它是在字母顺序之前还是之后。它不允许您使用一个实例变量来初始化另一个实例变量。

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

从第10.5.5节:

字段声明可能包括变量初始值设定项。对于静态 字段、变量初始值设定项对应于 在类初始化期间执行。例如字段, 变量初始值设定项对应于 在创建类的实例时执行

§10.5.4中描述的默认值初始化适用于所有 字段,包括具有变量初始值设定项的字段。因此,当 类初始化时,该类中的所有静态字段都是第一个 初始化为默认值,然后是静态字段 初始值设定项按文本顺序执行。同样,当一个实例 创建一个类时,该实例中的所有实例字段都是第一个 初始化为其默认值,然后是实例字段 初始值设定项按文本顺序执行


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

它在
Class1 class=new Class1(30,a)上出错行。那条线应该做什么?你想在课堂上做什么?不要使用关键字作为可变名称(它不应该编译)。我要让一个球沿着一条寓言曲线,我想把“a”作为时间和我的x坐标,并用它创建一个方程来计算y坐标,它在
Class1 class=new Class1(30,a)上的错误行。那条线应该做什么?你想在课堂上做什么?不要使用关键字作为可变名称(它不应该编译)。我要让一个球沿着一条寓言曲线,我想把“a”作为时间和我的x坐标,然后用它创建一个方程来计算y坐标,来详细说明为什么?可能对OP有用。(或者指出他做错了什么)我不太确定限制背后的原因,只是为了避免一些不直观的初始化行为。一个实例字段不能用于初始化另一个实例字段
a
可能在
class
之前没有初始化过,反之亦然。@Steve没有实际的理由说明编译器不能对字段初始化器强制执行排序-Java初始化器可以,类似于OP的代码是有效的,如果不一定是个好主意的话。所以问题是为什么C#编译器不会。说“你不能,因为规范说你不能”或多或少是一种重复。这不是很有用,因为很明显,你不能做任何事情。我在下面的答案中找不到解释为什么你不能。。。但是我没有太多的时间来仔细阅读规范。我希望我做了,因为我对这件事也很好奇,事实上我昨天就试着做这件事!想解释一下原因吗?可能对OP有用。(或者指出他做错了什么)我不太确定限制背后的原因,只是为了避免一些不直观的初始化行为。一个实例字段不能用于初始化另一个实例字段
a
可能在
class
之前没有初始化过,反之亦然。@Steve没有实际的理由说明编译器不能对字段初始化器强制执行排序-Java初始化器可以,类似于OP的代码是有效的,如果不一定是个好主意的话。所以问题是为什么C#编译器不会。说“你不能,因为规范说你不能”或多或少是一种重复。这不是很有用,因为很明显,你不能做任何事情。我在下面的答案中找不到解释为什么你不能。。。但是我没有太多的时间来仔细阅读规范。我希望我做了,因为我对这件事也很好奇,事实上我昨天就试着做这件事!