【问题标题】:Overloading operator== for an interface [duplicate]为接口重载 operator== [重复]
【发布时间】:2012-04-09 07:33:54
【问题描述】:

可能重复:
Can I overload an == operator on an Interface?

我确实了解如何为单个班级重载 operator==。我什至让它与继承一起工作。但我似乎无法为接口实现它。想象一下:

IFoo foo1 = new Foo(42);
IFoo foo2 = new Foo(42);
Assert.IsTrue( foo1 == foo2 ); // fails

正如您可能已经猜到的那样,我希望实现 IFoo 的类表现得像一个值类型(至少在比较相等性时)。如您所见,当Assert 发生时,foo1foo2 的具体类型Foo 不再“已知”。所知道的只是他们的界面IFoo

当然,我可以使用IEquatable<IFoo> 并改写foo1.Equals(foo2),但这不是重点。如果IFoo 是一个抽象基类而不是一个接口,我可以重载operator== 没问题。 那么我该如何为界面做同样的事情呢?

问题基本上归结为无法编写以下内容,因为leftright至少之一必须是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#。这就是标签的原因。

标签: c# operator-overloading


【解决方案1】:

不可能在接口上重载运算符。在其核心重载运算符基本上是编译器将运算符映射到的静态方法。这意味着重载运算符具有与接口中的静态方法相同的所有问题,因此是不允许的。

指定接口具有非引用相等语义的最佳方法是让它派生自IEquatable&lt;T&gt;。这绝不是对调用者或实现者的约束性承诺,而是对两者的暗示。

【讨论】:

  • 很遗憾,这不受支持,并且不能选择使用基类。至少有一点点tool support 可以找到operator== 的用法,而不是.Equals
【解决方案2】:

您可以在界面中定义bool Equals(Object) 而不是运算符,并使用Object.Equals(Object, Object) 进行比较。

这种比较是类级别的,而不是接口级别的,并且在比较中还可能涉及类的其他属性。如果您希望对两个接口进行纯粹的比较(比较属性),那么您必须定义自己的静态方法来执行此操作。

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 2018-04-06
    • 2011-08-30
    • 1970-01-01
    • 2012-05-03
    • 2020-08-27
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多