Reputation: 7264
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
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
Reputation: 9017
What you're talking about here is an implementation detail, a Interface should not (cannot) define how it is implemented.
Upvotes: -2
Reputation: 11095
Besides CodeInChaos' answer you may be interested in reading Guidelines for Overriding Equals() and Operator ==.
Upvotes: 3
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
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