重载的运算符参数始终为null

时间:2010-10-03 14:40:53

标签: c# .net operator-overloading

所以我有一个类覆盖Equals(object obj)和GetHashCode()以及实现IEquatable。为了使这种类型的工作在检查相等性时更自然,我想,哎呀,我会重载等式运算符和不等式运算符,不用担心......

哦,担心......考虑以下内容 - 两个myType实例都不为空:

if (myType != container.myType) //NullReferenceException
{
    //never get here
}
//never get here either

现在,容器只是另一个用来保存myType实例的类,用于缓存项目。

以下是myType的实际(相关)代码:

public class MyType : IEquatable<MyType>
{
    public static bool operator ==(MyType myTypeA, MyType myTypeB)
    {
        return myTypeA.Equals(myTypeB);
    }

    public static bool operator !=(MyType myTypeA, MyType myTypeB)
    {
        return !(myTypeA == myTypeB);
    }

    public override bool Equals(object obj)
    {
        if (obj != null && obj is MyType)
        {
            return Equals((MyType)obj);
        }
        return false;
    }

    public bool Equals(MyType other)
    {
        if (other != null)
        {
            return other.ToString() == ToString();
        }
        return false;
    }
}

这方面有什么经验吗?

感谢。

3 个答案:

答案 0 :(得分:3)

指点几点 -

  1. 如果您在类上重写了==!=,请务必使用ReferenceEquals检查重载实现中的null,而不是==,因为调用你的重载运算符,或者进入循环或尝试在空Equals引用上调用this,这可能就是这里发生的事情。
  2. 不要在课程上覆盖==!=。这些运算符用于值相等,而类实际上并不是为了实现价值相等。删除运算符重载,或使MyType成为结构。

答案 1 :(得分:2)

棘手的问题是你在Equal覆盖中使用等于运算符,如下所示:

public bool Equals(MyType other)
{
    if (other != null)

它转到你的重载!=运算符,它依次转到你的==运算符,它试图做null.Equals ......

答案 2 :(得分:1)

正如其他人所说,你需要小心检查空值,因为它会再次调用你的相等函数,通常会导致StackOverflowException。

当我在类上使用IEquatable接口时,我通常使用以下代码:

public override bool Equals(object obj)
{
    // If obj isn't MyType then 'as' will pass in null
    return this.Equals(obj as MyType);
}

public bool Equals(MyType other)
{
    if (object.ReferenceEquals(other, null))
    {
        return false;
    }

    // Actual comparison code here
    return other.ToString() == this.ToString();
}