【发布时间】:2015-06-28 01:27:36
【问题描述】:
我有三个对象:
private static readonly Apple a, c;
private readonly Orange b;
这段代码是从我的构造函数中调用的:
public SomeClass()
{
a = new Apple();
b = new Orange(a.getDna());
c = new Apple(b.getDna());
}
它给了我错误Readonly field cannot be used as an assignment target。如果我删除静态 或 只读修饰符,它会完美编译。 (这里有错误的警告吗?)
在此处查看其他答案时,我发现我应该使用静态构造函数,例如:
static SomeClass()
{
a = new Apple();
c = new Apple(b.getDna());
}
public SomeClass()
{
b = new Orange(a.getDna());
}
但这会导致首先调用静态构造函数并导致错误,因为 b 不会被初始化。
我该如何规避这个问题?
附:我对 C# 比较陌生
【问题讨论】:
-
当您创建类的新实例并调用特定的构造函数时,通常先调用静态一个,然后调用第二个。但是启动应用程序时会调用静态构造函数
-
先调用静态构造函数,第一次访问该类型时调用。问题是,为什么要在静态上下文中访问实例变量 (
c = new Apple(b.getDna());)。这没有意义(并且会引发编译时错误)并且从远处闻到气味。要访问b,您需要一个实例,而您在静态上下文中没有一个(没有this)。你应该重新考虑你的设计和你的目标是什么static/non-static -
我已编辑问题以显示将首先调用静态构造函数。关于你评论的后半部分,我很快就会用我的实际代码再次编辑我的问题,以表明我遇到了这个问题。
-
我强烈建议您更改此实现设计,因为我看到您的静态成员(
c)依赖于实例成员(b),这根本不是一个好主意。