web-dev-qa-db-fra.com

Surcharge de l'opérateur ==,! =, Est égal à

J'ai déjà traversé question

Je comprends que, il est nécessaire d’implémenter ==, != Et 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);
    }
}

Je suppose que j'ai écrit le code correctement pour remplacer les opérateurs ==, !=, Equals. Bien que, je reçois des erreurs de compilation comme suit.

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

La question est donc: comment passer outre les opérateurs et se débarrasser de cette erreur?

41
Sagar R. Kothari

Je pense que vous avez déclaré la méthode Equals comme ceci:

public override bool Equals(BOX obj)

Depuis le object.Equals méthode prend un objet, il n’ya pas de méthode à remplacer par cette signature. Vous devez le remplacer comme ceci:

public override bool Equals(object obj)

Si vous voulez le type-sûr Equals, vous pouvez implémenter IEquatable<BOX>.

31
Selman Genç

Comme Selman22 l’a dit, vous remplacez la valeur par défaut object.Equals méthode, qui accepte un object obj et pas un type de compilation sûr.

Pour que cela se produise, faites en sorte que votre type implémente 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;
        }
    }
}

Une autre chose à noter est que vous effectuez une comparaison en virgule flottante à l'aide de l'opérateur d'égalité et que vous risquez de perdre de la précision.

47
Yuval Itzchakov

En fait, c'est un "comment faire". Donc, voici l'implémentation de référence:

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

REF: https://msdn.Microsoft.com/en-us/library/336aedhh (v = vs.100) .aspx # Exemples

19
epox