可能是重复问题:
我可以在接口上重载==运算符吗?
我知道如何为单个类重载operator==
。我甚至使它适用于继承。但是我似乎无法为一个接口实现它。想象一下以下情况:
IFoo foo1 = new Foo(42);
IFoo foo2 = new Foo(42);
Assert.IsTrue( foo1 == foo2 ); // fails
正如你所猜测的那样,我希望实现IFoo的类在比较相等性时表现得像值类型。正如你所看到的,当Assert发生时,foo1和foo2的具体类型Foo不再“已知”。所有已知的仅为它们的接口IFoo。
当然,我可以使用IEquatable并编写foo1.Equals(foo2)来代替,但这不是重点。如果IFoo是抽象基类而不是接口,我可以轻松地重载operator==。那么我该如何处理接口呢?
问题基本上归结为无法编写以下内容,因为left和right中至少有一个必须是Foo:
public interface IFoo : IEquatable<IFoo>
{
int Id { get; }
}
public class Foo : IFoo
{
public int Id { get; private set; }
... // some implementation here
public static bool operator== ( IFoo left, IFoo right ) // impossible
{
... // some null checks here
return left.Id == right.Id;
}
}
重载接口的operator==
是否不可能,还是我错过了什么技巧?