System.StackOverflowException
Process is terminated due to StackOverflowException.
A method is calling itself infinitely, or the call stack is too deep. Unlike most exceptions, StackOverflowException can’t be caught.
Fix 1: Property Calling Itself
// ❌ Property getter calls itself
public string Name {
get { return Name; } // 💥 Infinite recursion
}
// ✅ Use a backing field
private string _name;
public string Name {
get { return _name; }
set { _name = value; }
}
// ✅ Or use auto-property
public string Name { get; set; }
Fix 2: Missing Base Case in Recursion
// ❌ No stopping condition
int Factorial(int n) {
return n * Factorial(n - 1); // 💥 Never stops
}
// ✅ Add base case
int Factorial(int n) {
if (n <= 1) return 1;
return n * Factorial(n - 1);
}
Fix 3: Implicit Conversion Operator Loop
// ❌ Conversion calls itself
public static implicit operator MyType(string s) {
return s; // 💥 Calls this operator again
}
// ✅ Create new instance explicitly
public static implicit operator MyType(string s) {
return new MyType { Value = s };
}
Fix 4: ToString Recursion
// ❌ ToString references itself
public override string ToString() {
return $"Object: {this}"; // 💥 Calls ToString again
}
// ✅ Reference specific properties
public override string ToString() {
return $"Object: {Name}, {Id}";
}
Fix 5: Convert to Iteration
// ❌ Deep recursion
void TraverseTree(Node node) {
if (node == null) return;
Process(node);
TraverseTree(node.Left);
TraverseTree(node.Right);
}
// ✅ Use a stack
void TraverseTree(Node root) {
var stack = new Stack<Node>();
stack.Push(root);
while (stack.Count > 0) {
var node = stack.Pop();
if (node == null) continue;
Process(node);
stack.Push(node.Right);
stack.Push(node.Left);
}
}