我调试问题已经有一段时间了,并且意识到这是由于在我本应该使用==的对象上使用object.Equals()引起的

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

那可能吗?以下代码遇到堆栈溢出异常...

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);
}


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

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/

10-12 17:44