【发布时间】:2012-04-09 07:33:54
【问题描述】:
我确实了解如何为单个班级重载 operator==。我什至让它与继承一起工作。但我似乎无法为接口实现它。想象一下:
IFoo foo1 = new Foo(42);
IFoo foo2 = new Foo(42);
Assert.IsTrue( foo1 == foo2 ); // fails
正如您可能已经猜到的那样,我希望实现 IFoo 的类表现得像一个值类型(至少在比较相等性时)。如您所见,当Assert 发生时,foo1 和foo2 的具体类型Foo 不再“已知”。所知道的只是他们的界面IFoo。
当然,我可以使用IEquatable<IFoo> 并改写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== 是不可能的,还是我错过了什么技巧?
【问题讨论】:
-
请不要在标题前加上 C#。这就是标签的原因。