我需要在非静态类构造函数中引用非静态类中的变量.[C#]

-2 c# static constructor class non-static

我正在尝试用天然卫星制造太阳系.目前我正在绘制一个相对于静态"太阳"类对象的行星,但我想让这个类使用另一个行星物体的位置并相对于该行星绘制.要做到这一点,我需要提取该行星对象的x和y位置.

这是我用于绘制行星的类的类构造函数.

Nebesko_Telo merkur = new Nebesko_Telo(Sun.x, Sun.y, 4, 12, 4.090909090909091,
                                       1, 255, 255, 255);
// A field initializer cannot reference the non-static field, method,
//    or property 'Form1.merkur'.
Nebesko_Telo venera = new Nebesko_Telo(merkur.x, merkur.y, 1, 23, 1.5, 1, 176, 108, 32);
Run Code Online (Sandbox Code Playgroud)

这是类构造函数.

public Nebesko_Telo(doubl _rel_tel_x, double _rel_tel_y, double _r, double _or,
                    double _Fi_mult, double _tilt_plant_nat, int _re, int_gr, int _bl) {
    r = _r;
    or = _or;
    Fi_mult = _Fi_mult;
    re = _re;
    gr = _gr;
    bl = _bl;
    tilt_planet_nat = _tilt_planet_nat;
    rel_tel_x = _rel_tel_x;
    rel_tel_y = _rel_tel_y;
}
Run Code Online (Sandbox Code Playgroud)

x和y位置不断更新每个tick,所以我需要它不断更新它:^ /.

Eri*_*ert 5

在字段初始化程序中this任何方式使用是非法的. merkur在你的初始化程序中,venera实际上是this.merkur重要的.

C#阻止了这种情况,因为该技术是bug的常见来源.字段初始值设定项构造函数体之前运行,包括基类构造函数的构造函数体.如果C#没有限制您访问this它,那么访问属性或调用尚未准备好使用的方法将非常容易.

有关详细信息,请参阅https://blogs.msdn.microsoft.com/ericlippert/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one/构造函数初始化程序运行的顺序.

您应该做的是将所有字段初始值设定项移动到构造函数体中.然后,您负责确保正文中的语句以正确的顺序运行,以进行所需的初始化.