c# - 用 Equals() 覆盖相等运算符

标签 c# operators overriding equality

我已经调试了一个问题很长一段时间,并意识到它来自于在我应该使用 object.Equals( )

为了防止此类问题,希望 == 运算符调用我已覆盖的 Object.Equals()

这可能吗?以下代码遇到 Stack-overflow 异常...

public static bool operator ==(Portfolio a, Portfolio b)
{
    return a != null && a.Equals(b);
}

public static bool operator !=(Portfolio a, Portfolio b)
{
    return a != null && !a.Equals(b);
}

谢谢!

最佳答案

您从 != 运算符递归调用 != 运算符,因此堆栈溢出。使用 ReferenceEquals 代替:

public static bool operator !=(Portfolio a, Portfolio b)
{
    return !object.ReferenceEquals(a, null) && !a.Equals(b);
}

也就是说,这段代码是有缺陷的,因为如果 a 为 null 而 b 不是,它将返回 false。您应该检查两个对象是否为空:

public static bool operator !=(Portfolio a, Portfolio b)
{
    if (object.ReferenceEquals(a, null))
    {
        return !object.ReferenceEquals(b, null);
    }

    return !a.Equals(b);
}

关于c# - 用 Equals() 覆盖相等运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37960087/

相关文章:

java - 在 Java 枚举中覆盖 valueof() 和 toString()

html - CSS 媒体查询不覆盖

class - Scala 自动 getter 和 setter 覆盖自定义 _=

c# - 'DateTime' 和 'DateTimeOffset' 之间的区别

c# - 超出存储分配。服务器响应为 : 5. 3.4 消息大小超过固定的最大消息大小

c++ - 我可以使用函数符号 operator#() 来调用内置类型的运算符吗?

c# - 两个左尖括号 "<<"在 C# 中是什么意思?

java - 使用 toString() 方法是一个抽象的例子

c# - 对方法调用和方法签名参数使用相同的变量名是一种好习惯吗?

c++ - 类变量 - 对齐