I have an interface like this:
public interface IFoo
{
int A {get;}
int B {get;}
}
and I have multiple classes implementing IFoo.
I want to check equality, not based on ReferenceEquality, but two IFoos should be considered equal, if both A and B is the same (in reality I'm checking a collection of Key-Value pairs sent through WCF, that is why I can't have ReferenceEquality).
Now if I have:
IFoo first = new FooBar1() { A = 1, B = 1};
IFoo second = new FooBar2() { A = 1, B = 1};
if (first == second) {
//this should return true
}
Currently IFoo
is IEquatable<IFoo>
, so FooBar1 and FooBar2 overrides Equals(IFoo other)
, but that's not what gets called on ==. I'm hunting through my code to replace a==b
with a.Equals(b)
everywhere, but that's just not nice.
What can I do?
No, you can neither overload an operator on an interface, nor ensure that any implementors do so (as operator overloading is static in C# ).
Your best option is what you've done, to make
IFoo
inherit fromIEquatable<IFoo>
and useEquals(IFoo)
What you're talking about here is an implementation detail, a Interface should not (cannot) define how it is implemented.
No, you can't. Overloading
==
requires static methods in one of the types you use, and an interface can't contain those. Extension methods can't help either. So on interfaces == is always using reference equality.Note that
a.Equals(b)
will throw an exception if a==null.Besides CodeInChaos' answer you may be interested in reading Guidelines for Overriding Equals() and Operator ==.