运算符重载==,!=,等于

时间:2014-08-23 11:46:28

标签: c# .net compiler-errors operator-overloading

我已经完成了question

我理解,有必要实施==!=Equals()

public class BOX
{
    double height, length, breadth;

    // this is first one '=='
    public static bool operator== (BOX obj1, BOX obj2)
    {
        return (obj1.length == obj2.length 
                    && obj1.breadth == obj2.breadth 
                    && obj1.height == obj2.height);
    }

    // this is second one '!='
    public static bool operator!= (BOX obj1, BOX obj2)
    {
        return !(obj1.length == obj2.length 
                    && obj1.breadth == obj2.breadth 
                    && obj1.height == obj2.height);
    }

    // this is third one 'Equals'
    public override bool Equals(BOX obj)
    {
        return (length == obj.length 
                    && breadth == obj.breadth 
                    && height == obj.height);
    }
}

我认为,我已正确编写代码以覆盖==!=Equals运算符。虽然,我得到编译错误如下。

'myNameSpace.BOX.Equals(myNameSpace.BOX)' is marked as an override 
but no suitable method found to override.

所以,问题是 - 如何覆盖上面的运算符&摆脱这个错误?

4 个答案:

答案 0 :(得分:39)

正如Selman22所说,您将覆盖默认的object.Equals方法,该方法接受object obj而不是安全的编译时类型。

为了实现这一点,请使用类型工具IEquatable<Box>

public class Box : IEquatable<Box>
{
    double height, length, breadth;

    public static bool operator ==(Box obj1, Box obj2)
    {
        if (ReferenceEquals(obj1, obj2))
        {
            return true;
        }

        if (ReferenceEquals(obj1, null))
        {
            return false;
        }
        if (ReferenceEquals(obj2, null))
        {
            return false;
        }

        return (obj1.length == obj2.length
                && obj1.breadth == obj2.breadth
                && obj1.height == obj2.height);
    }

    // this is second one '!='
    public static bool operator !=(Box obj1, Box obj2)
    {
        return !(obj1 == obj2);
    }

    public bool Equals(Box other)
    {
        if (ReferenceEquals(null, other))
        {
            return false;
        }
        if (ReferenceEquals(this, other))
        {
            return true;
        }

        return height.Equals(other.height) 
               && length.Equals(other.length) 
               && breadth.Equals(other.breadth);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }
        if (ReferenceEquals(this, obj))
        {
            return true;
        }

        return obj.GetType() == GetType() && Equals((Box)obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int hashCode = height.GetHashCode();
            hashCode = (hashCode * 397) ^ length.GetHashCode();
            hashCode = (hashCode * 397) ^ breadth.GetHashCode();
            return hashCode;
        }
    }
}

另一件需要注意的事情是,您使用相等运算符进行浮点比较,您可能会遇到精度损失。

答案 1 :(得分:26)

我认为你宣布Equals方法是这样的:

public override bool Equals(BOX obj)

由于object.Equals方法接受一个对象,因此没有方法可以使用此签名覆盖。你必须像这样覆盖它:

public override bool Equals(object obj)

如果您想要类型安全的Equals,,则可以实施IEquatable<BOX>

答案 2 :(得分:18)

事实上,这是一个&#34;如何&#34;学科。所以,这是参考实现:

    public class BOX
    {
        double height, length, breadth;

        public static bool operator == (BOX b1, BOX b2)
        {
            if (null == b1)
                return (null == b2);

            return b1.Equals(b2);
        }

        public static bool operator != (BOX b1, BOX b2)
        {
            return !(b1 == b2);
        }

        public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType())
                return false;

            var b2 = (BOX)obj;
            return (length == b2.length && breadth == b2.breadth && height == b2.height);
        }

        public override int GetHashCode()
        {
            return height.GetHashCode() ^ length.GetHashCode() ^ breadth.GetHashCode();
        }
    }

参考:https://msdn.microsoft.com/en-us/library/336aedhh(v=vs.100).aspx#Examples

答案 3 :(得分:2)

public class BOX
{
    double height, length, breadth;

    public static bool operator == (BOX b1, BOX b2)
    {
        if (b1 is null)
            return b2 is null;

        return b1.Equals(b2);
    }

    public static bool operator != (BOX b1, BOX b2)
    {
        return !(b1 == b2);
    }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        return obj is BOX b2? (length == b2.length && 
                               breadth == b2.breadth && 
                               height == b2.height): false;

    }

    public override int GetHashCode()
    {
        return (height,length,breadth).GetHashCode();
    }
}