【问题标题】:Visual Studio debugger crashVisual Studio 调试器崩溃
【发布时间】:2018-02-25 01:43:20
【问题描述】:

所以我在 Visual Studio 中遇到了一些奇怪的错误。调试器崩溃(我认为)。这是它崩溃的功能。这是针对 C# 中的通用 BST,其中 == 运算符被重载以添加节点之间的轻松比较。

    public static bool operator ==(Node<T> lhs, Node<T> rhs)
    {
        if ((lhs == null) || (rhs == null))
        {
            return false;
        }

        if((lhs.Data).CompareTo(rhs.Data) == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

它在这一行崩溃:

if ((lhs == null) || (rhs == null))

调试时,lhs确实为null,一开始比较就挂了,然后显示这个信息:

然后调试会话会自行结束。

我不太明白,因为为了找出我的代码的问题,我正在尝试调试,但随后发生了此错误,会话自行结束。我以前从未见过这种情况。

【问题讨论】:

  • 试试if (lhs.Equals(null) || rhs.Equals(null)),我认为你正在启动一些无限递归。
  • 堆栈溢出。使用 ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null) 否则您将递归调用 == 运算符。
  • @RonBeyer 如果其中一个为空,则会抛出空引用异常
  • 在我超载的operator == 中,我做的第一件事就是使用==。你认为这里会发生什么?
  • @KenWhite 我猜它让我感到困惑的原因是因为我在重载运算符中使用的两种类型是 Node 和 Node,我并没有真正考虑 null a Node,所以我认为它不会递归调用重载运算符。我想它可能会使用默认的 == 进行比较。我最终包含了一个引用等于比较,然后检查其中一个是否为空,最后比较值。

标签: c# visual-studio debugging


【解决方案1】:

您正在递归调用== 运算符。使用if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) 来避免这种情况。

或者,使用 C#7 模式匹配: if (lhs is null || rhs is null)

【讨论】:

  • 是的,这行得通。 Visual Studio 还建议我通过使用“lhs is null”和“rhs is null”来简化您的答案。我认为这是完全相同的事情,只是更清洁一点。谢谢!
  • 这是 c#7 语法,但它会起作用。此答案适用于所有版本的 c#。
  • 进一步预期,由于递归错误,导致堆栈溢出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
相关资源
最近更新 更多