TDaver
TDaver

Reputation: 7264

Can I overload an == operator on an Interface?

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?

Upvotes: 21

Views: 9464

Answers (5)

Błażej Szlaczek
Błażej Szlaczek

Reputation: 1

Since introduction of C# 8 you can provide interfaces with default implementations and static methods (which allows you o define operators for interfaces)

More here: https://learn.microsoft.com/dotnet/csharp/tutorials/default-interface-methods-versions

Upvotes: -1

MattDavey
MattDavey

Reputation: 9017

What you're talking about here is an implementation detail, a Interface should not (cannot) define how it is implemented.

Upvotes: -2

Albireo
Albireo

Reputation: 11095

Besides CodeInChaos' answer you may be interested in reading Guidelines for Overriding Equals() and Operator ==.

Upvotes: 3

Jamiec
Jamiec

Reputation: 136104

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 from IEquatable<IFoo> and use Equals(IFoo)

Upvotes: 6

CodesInChaos
CodesInChaos

Reputation: 108800

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.

Upvotes: 26

Related Questions