Consultez le code suivant, où ClassOne
est une classe dérivée de IClass
:C# - opérateur d'égalité avec la liste de type d'interface ne fonctionne pas comme prévu
List<IClass> list = new List<IClass>();
list.Add(new ClassOne("foo", "bar"));
list.Add(new ClassOne("baz", "bam"));
List<IClass> list2 = new List<IClass>();
list2.Add(new ClassOne("foo", "bar"));
list2.Add(new ClassOne("baz", "bam"));
if (list == list2)
Console.WriteLine("Lists are equal.");
else
Console.WriteLine("Lists are NOT equal.");
L'opérateur d'égalité renvoie false (c.-à-listes ne correspondent pas), outre le fait que le operator ==
, operator !=
, Equals(ClassOne)
, Equals(object)
et GetHashCode()
ont été mis en œuvre/remplacé pour ClassOne
. Pourquoi donc? Je m'attendrais à ce que l'opérateur d'égalité revienne vrai. Existe-t-il d'autres méthodes/interfaces qui doivent être implémentées pour que l'opérateur ==
fonctionne comme prévu?
Pour référence, voici la mise en œuvre de ClassOne
et IClass
:
public interface IClass
{
string getA();
string getB();
} //interface
public class ClassOne : IClass, IEquatable<ClassOne>
{
public ClassOne(string a, string b)
{
strA = a;
strB = b;
}
public string getA()
{
return strA;
}
public string getB()
{
return strB;
}
public bool Equals(ClassOne other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
if (!string.Equals(strA, other.strA))
return false;
return string.Equals(strB, other.strB);
}
public override bool Equals(object other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
if (other is ClassOne)
{
ClassOne c1 = (ClassOne)other;
return Equals(c1);
}
//not ClassOne, so it is not equal
return false;
}
public override int GetHashCode()
{
int hc_a = -1;
if (null != strA)
hc_a = strA.GetHashCode();
int hc_b = -1;
if (null != strB)
hc_b = strB.GetHashCode();
return hc_a^hc_b;
}
public static bool operator ==(ClassOne left, ClassOne right)
{
if (ReferenceEquals(left, right)) return true;
if (ReferenceEquals(left, null) || ReferenceEquals(right, null))
return false;
return left.Equals(right);
}
public static bool operator !=(ClassOne left, ClassOne right)
{
return !(left == right);
}
private string strA, strB;
} //class
Toute aide ou des conseils dans la bonne direction seront appréciés. Merci.
C'est mauvais. Donc, je dois utiliser 'list.Equals (list2)' chaque fois que je veux vérifier le contenu des listes pour l'égalité? – Striezel
Non. 'Equals' n'est pas surchargé non plus. Vous auriez besoin d'utiliser 'SequenceEquals' de Linq ou d'un autre mécanisme. –