Det er ikke ualmindeligt, at man ser C# kode som herunder, hvor == operatoren benyttes til at sammenligne to variable.
MyClass o1 = ...;
MyClass o2 = ...;
if (o1 == o2)
{
// ...
}
Muligheden for at overloade == operatoren (og Equals) i C# giver problemer med ovenstående if-statement. Når man bruger == eller Equals, skal man skal kende implementation af MyClass nøje for at vide præcis, hvad ovenstående kode gør. Ejeren af MyClass kan tilføje eller fjerne overload af == operatoren og dermed ændre resultatet af betingelsen i ovenstående if-statement. Det kan vel nærmest sammenlignes med, at man en dag opdager, at ikke alene kan man bruge sin bilnøgle til sin egen bil, men man kan bruge samme nøgle til alle andre Porscher i verden (forudsat at man kører Porsche).
Ikke nok med at ejeren af ovenstående skal kende detaljerne i implementationen af MyClass. Udviklere, som skal vedligeholde ovenstående kode, skal også vide, hvad hensigten med koden egentlig er. Er hensigten at sammenligne objektreferencer, eller er hensigten at sammenligne en eller anden form for identity defineret af MyClass?
Man kan gøre sig selv den tjeneste aldrig at bruge Equals eller == operator, hvis man ønsker at sammenligne objektreferencer. I stedet kan man gøre hensigten mere tydelig ved altid at bruge Object.ReferenceEquals, når man ønsker at sammenligne referencer.
C++ er lidt sejere på det punkt, i det der er forskel på pointer equality og objekt equality. Man kan ikke overloade == operatoren for pointers, og identity mellem to objekter er kun defineret, hvis man overloader == for klassen. Det betyder, at uden en == operator overload, giver linje 7 herunder en compile fejl. Har man sådan en overload, vil b1 være sand (formentlig – afhængig af ens overload) og b2 vil være falsk.
1: MyClass *t1 = new MyClass();
2: MyClass *t2 = new MyClass();
3:
4: t1->value = 2;
5: t2->value = 2;
6:
7: bool b1 = *t1 == *t2; // Kræver operator overload
8: bool b2 = t1 == t2;