ho la seguente classeimplementazione IEquatables solo chiamato se la base Equals viene sovrascritto
class Product : IEquatable<Product>
{
public Guid Id { get; set; }
public bool Equals(Product other)
{
return Id.Equals(other.Id);
}
}
Se provo e creare un elenco unico degli elementi di una lista come segue
Guid a = Guid.NewGuid();
List<Product> listA = new List<Product>();
listA.Add(new Product(){Id = a});
List<Product> listB = new List<Product>();
listB.Add(new Product()
{
Id = a
});
Debug.Assert(listA.Union(listB).Count()==1);
due articoli vengono restituiti, ciò si verifica fino a quando ho l'override del metodo Object.equalsQ, una volta che faccio questo e il mio codice è il seguente
class Product : IEquatable<Product>
{
public Guid Id { get; set; }
public bool Equals(Product other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return other.Id.Equals(Id);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (Product)) return false;
return Equals((Product) obj);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
viene ora chiamato il metodo IEquatable Equals, ma solo se sovrascrivo il metodo base, inoltre, se metto un breakpoint sull'oggetto equals, il metodo non viene mai chiamato.
Perché è questo?
---- UPDATE
Quindi, con la classe del prodotto
class Product : IEquatable<Product>
{
public Guid Id
{
get;
set;
}
public bool Equals(Product other)
{
return Id.Equals(other.Id);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
Se GetHashCode viene rimosso, l'attuazione IEquatable degli Eguali non è mai colpito Capisco si dovrebbe generalmente implementare Equals e GetHashCode insieme, è questo perché?
Aggiungendo che l'implementazione di 'GetHashCode' alla tua classe originale ti dà il comportamento che vuoi, sembra. – AakashM