c# - StackOverflow 在设计比较运算符时

标签 c# equals operator-keyword

根据 this article , 我的Equal(Thing) 如下所示。

public override int GetHashCode() { return Id.GetHashCode(); }

public override bool Equals(object input)
{
  Thing comparee = input as Thing;
  return comparee != null && comparee.Id == Id;
}

public static bool operator ==(Thing self, Thing other)
{
  return self != null && other != null && self.Id == other.Id;
}

public static bool operator !=(Thing self, Thing other)
{
  return self == null || other == null || self.Id != other.Id;
}

问题是,虽然它在我添加运算符重新定义之前工作,但现在我得到 StackOverflowException。我错过了什么?

最佳答案

一旦您定义了一个比较Thing== 运算符,当您说someThing == null 时就会使用它。 != 也是如此。

所以如果你说 self == other,你最终会调用 operator ==(self, other)。在您的标准中,您有 self != null,它调用 operator !=(self, null)...检查是否 self == null,从而调用 operator ==(self, null),然后一圈又一圈,直到用完堆栈空间。

我很确定您可以通过将内容转换为 object 来解决这个问题,以便进行引用比较。或者,你可以说 Object.ReferenceEquals(self, null) 等,它不依赖于 == 所以你不会得到递归。

关于c# - StackOverflow 在设计比较运算符时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38864793/

相关文章:

c# - Sitecore-Web Api 用户认证

c# - UWP:从HID捕获卡读取输入字节

c# - ReferenceEquals 在处理字符串时出错

java - 我们是否必须为放在 HashMap 中的枚举覆盖 equals/hashcode

java - <+ 在 Java 中是什么意思?

Go:(运算符 + 未在 slice 上定义)

c# - 用于发送短信和电子邮件通知的 Azure 服务

c# - 遍历复选框列表并将数据库中的值分配给选定的列表(如果数据库具有该值)

java - 如何继续在数组上提供方法,直到它等于其他数组

c++ - 嵌套智能指针运算符->