堆栈溢出错误 - C#

Stack Overflow Error - C#

我不断收到堆栈溢出错误,但我不知道为什么或如何修复它。这是我的代码:

 private void ShowDiff(int leftIndex, int rightIndex)
        {
            if (leftIndex > 0 && rightIndex > 0 &&
                _compareFunc(_left[_preSkip + leftIndex - 1], _right[_preSkip + rightIndex - 1]))
            {
                ShowDiff(leftIndex - 1, rightIndex - 1);
                FireLineUpdate(DiffType.None, _preSkip + leftIndex - 1, -1);
            }
            else
            {
                if (rightIndex > 0 &&
                    (leftIndex == 0 ||
                     _matrix[leftIndex, rightIndex - 1] >= _matrix[leftIndex - 1, rightIndex]))
                {
                    ShowDiff(leftIndex, rightIndex - 1);
                    FireLineUpdate(DiffType.Inserted, -1, _preSkip + rightIndex - 1);
                }
                else if (leftIndex > 0 &&
                         (rightIndex == 0 ||
                          _matrix[leftIndex, rightIndex - 1] < _matrix[leftIndex - 1, rightIndex]))
                {
                    ShowDiff(leftIndex - 1, rightIndex);
                    FireLineUpdate(DiffType.Deleted, _preSkip + leftIndex - 1, -1);
                }
            }

        }

这是我不断收到的错误:

'System.WhosebugException' 类型的未处理异常发生在 Comparer.exe

感谢任何帮助。

编辑:添加了中断,以防没有条件为真。


相反,使用循环重写函数。此外,您可以稍微简化您的逻辑。

注意:leftIndexrightIndex 都大于 0 的假设仍然存在。

 private void ShowDiff(int leftIndex, int rightIndex)
 {
     while(leftIndex > 0 && rightIndex > 0)
     {
         if (leftIndex > 0 && rightIndex > 0 &&
                _compareFunc(
                    _left[_preSkip + leftIndex - 1],
                    _right[_preSkip + rightIndex - 1]))
         {
             leftIndex--;
             rightIndex--;
             FireLineUpdate(
                 DiffType.None,
                 _preSkip + leftIndex - 1,
                 -1);
         }
         else
         {
             if (rightIndex > 0 &&
                    (_matrix[leftIndex, rightIndex - 1] >=
                        _matrix[leftIndex - 1, rightIndex]))
             {
                 rightIndex--;
                 FireLineUpdate(
                     DiffType.Inserted,
                     -1,
                     _preSkip + rightIndex - 1);
             }
             else if (_matrix[leftIndex, rightIndex - 1] <
                         _matrix[leftIndex - 1, rightIndex]))
             {
                 leftIndex--;
                 FireLineUpdate(
                     DiffType.Deleted,
                     _preSkip + leftIndex - 1,
                     -1);
             }
             else
             {
                 break;
             }
         }
     }
 }