每当我实例化A类的实例时,我都会不断获得StackOverFlowException
。我知道它与A.b
字段是从类A派生的类型这一事实有关。但为什么会导致异常呢?
static void Main(string[] args)
{
A a = new A(); // exception
}
class A
{
private B b = new B();
}
class B:A {}
谢谢
答案 0 :(得分:5)
因为B是从A继承的,所以每次创建A时,都会创建一个B,然后创建另一个B.你基本上创建了一个无限循环的类创建。
答案 1 :(得分:4)
以下是幕后发生的事情
B
b
的实例
B
派生自A
,因此拥有自己的字段b
。此时它返回到步骤#2并重复直到发生堆栈溢出答案 2 :(得分:1)
因为A引用了一个B类,它是从A派生的。由于构造函数链接,B的ctor调用A的ctor,导致创建一个新的B实例,它将持续到永恒或一个StackOverflowException。
答案 3 :(得分:1)
因为构造函数是递归调用的
答案 4 :(得分:1)
因为你有一个循环引用
为了制作B你必须制作A 为了制作A,你必须制作一个B
因此它向下隧道。
要修复它,请不要初始化私有字段。
答案 5 :(得分:1)
如果您希望子类知道任何派生类型,请使用泛型。这在CSLA.NET Framework中非常重要。
public class A<T> where T : A<T>
{
}
public class B : A<B>
{
}
请注意,A不引用B,但您可以在方法等基础上封装派生类型。
答案 6 :(得分:0)
当你创建一个A的实例时,它会创建一个B ....的内部实例 - 猜测是什么 - 创建一个B的内部实例 - 猜测是什么 - 创建一个B的内部实例 - 它将 - 猜猜看 - 创建一个B的内部实例。
这是因为B构造函数继承了递归的A构造函数。堆栈溢出。