In un programma sensibile alle prestazioni, sto tentando di chiamare esplicitamente IEquatable<T>.Equals()
e non Object.Equals
(per evitare la boxe nel mio caso). Nonostante i miei migliori sforzi, il compilatore sceglie sempre Object.Equals()
- che non capisco. Una classe esempio inventato:Selezione del sovraccarico errata chiamata di sovraccarico IEquatable <T>. Equals
class Foo : IEquatable<Foo>
{
public bool Equals(Foo f)
{
Console.WriteLine("IEquatable.Equals");
return true;
}
public override bool Equals(object f)
{
Console.WriteLine("Object.Equals");
return true;
}
}
codice Altrettanto artificiosa che illustra il problema:
// This calls IEquatable<Foo>
Foo f = new Foo();
f.Equals(f);
// This calls Object.Equals
IEquatable<Foo> i = new Foo();
i.Equals(i);
L'uscita di questo codice è:
IEquatable.Equals
Object.Equals
ho letto di article on overloading Jon Skeet ed è venuto fuori ancora non capisco il problema qui. Quindi la mia domanda è, come faccio a chiamare esplicitamente IEquatable<Foo>.Equals
sulla variabile i
sopra?
A 'Foo' ** IS ** an' IEquatable '. Un 'IEquatable ' ** NON è ** un 'Foo'. Questo rende più chiaro il motivo per cui questo funziona come fa - in particolare, perché 'public bool Equals (Foo f)' non può essere chiamato con un 'IEquatable '? –
Se sei sicuro che 'i' * è * a' Foo', quindi 'i.Equals ((Foo) i);'. Ma, naturalmente, se sei sicuro del suo tipo, quando non è il tipo dichiarato di "i"? –
Su una nota non correlata, posso solo dire che questa è una bella prima domanda - hai dato una chiara dichiarazione del tuo problema, codice riproducibile, output, una chiara dichiarazione del risultato atteso, e infine, dimostrazione di ricerca indipendente - avere un upvote e benvenuti a Stack Overflow :) –