(C#)重载==运算符时出现问题

时间:2009-06-25 04:13:19

标签: c# null operator-overloading

我在课程上重载了==运算符,如下所示:

public static bool operator ==(Table pt1, Table pt2) {
    return Compare(pt1, pt2) == 0 && pt1.TableName == pt2.TableName;
}

比较将像strcmp在c ++中一样工作,返回一个整数。问题是,如果我执行if(MY_CLASS == null),它将调用我的==运算符,从而调用我的Compare函数。什么是alternatiev?检查pt1和pt2以查看它们是否为空?或者只是在pt2?

4 个答案:

答案 0 :(得分:12)

您应该检查Microsoft的guidelines以实现'=='运算符以及覆盖'Equals()'。

根据他们的例子改编你想要的东西:

public static bool operator ==(Table a, Table b)
{
    // If both are null, or both are same instance, return true.
    if (System.Object.ReferenceEquals(a, b))
    {
        return true;
    }

    // If one is null, but not both, return false.
    if (((object)a == null) || ((object)b == null))
    {
        return false;
    }

    // Return true if the fields match:
    return Compare(a, b) == 0 && a.TableName == b.TableName;
}

答案 1 :(得分:3)

您将需要空检查才能获得正确的行为。在我看来,添加此检查的最明确方法是调用object.ReferenceEquals(x, null),因为它是一个直接的非多态方法调用,并且可能相当有效。

答案 2 :(得分:2)

只需将此行添加到您的运营商:

if ((object)pt1 == null || (object)pt2 == null) return false;

(object)强制转型是为了防止递归(来自object.==而不是MY_CLASS.==

虽然我不确定将null与null比较时应该出现的条件。

答案 3 :(得分:2)

我问了一个类似的问题here。看看吧。

    public bool Equals(ClauseBE other)
    {
        if (this._id == other._id)
        {
            return true;
        }
        return false;
    }

    public override bool Equals(Object obj)
    {
        if (obj == null)
        {
            return base.Equals(obj);
        }

        if (!(obj is ClauseBE))
        {
            throw new InvalidCastException("The 'obj' argument is not a ClauseBE object.");
        }

        return Equals(obj as ClauseBE);
    }

    public override int GetHashCode()
    {
        return this._id.GetHashCode();
    }


    public static bool operator ==(ClauseBE a, ClauseBE b)
    {
        if (ReferenceEquals(a, null) && ReferenceEquals(b, null))
        {
            return true;
        }

        if (ReferenceEquals(a, null) || ReferenceEquals(b, null))
        {
            return false;
        }

        return a.Equals(b);
    }

    public static bool operator !=(ClauseBE a, ClauseBE b)
    {
        return !(a == b);
    }