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?
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>
.
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.
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