为什么设置静态方法会导致堆栈溢出?

如果我使用set访问器更改C#中的静态类成员,为什么会出现堆栈溢出错误?

我不是把这个视为一个错误,我只是想知道机器内部究竟发生了什么。

你不应该; 我希望你有类似的东西:

private static int foo; public static int Foo { get {return foo;} set {Foo = value;} // spot the typo!!! (should be foo) } 

基本上,该set是:

 static void set_Foo(int value) { set_Foo(value); } 

所以这是递归的,最终将耗尽堆栈(假设没有优化等)。

没有代码示例,就无法进行更多诊断。

我猜你在做这样的事情:

 public class MyClass { public int TheInt { get { return TheInt; } set { TheInt = value; // assignment = recursion! } } 

问题是,在TheInt的set函数中,您要为TheInt赋值,这将导致对set函数的嵌套调用。 你得到递归,然后堆栈溢出。

在调试器中查看你的调用堆栈(当抛出exception时你会停止,对吧?)这应该可以强烈指示正在发生的事情。

我想我对这个问题有不同的解释。 问题不在于溢出发生的原因,而是为什么访问器会导致溢出。 在这种情况下,访问器是一个函数调用,就像任何其他函数一样,因此它确实占用了堆栈空间。

如果您使用没有访问器的公共成员, MyClass.myint不会成为函数调用,并且不能溢出堆栈。

你想知道内部发生了什么导致堆栈溢出?

您的方法调用另一个导致无限递归的方法:A调用A,堆栈溢出。 A调用B,然后B调用A,堆栈溢出。 等等。

正如Marc Gravell所说,这可能是你房产实施中的一个错误。