c# - 为接口(interface)重载 operator==

标签 c# operator-overloading

<分区>

Possible Duplicate:
Can I overload an == operator on an Interface?

我明白如何重载 operator==对于一个类(class)。我什至让它与继承一起工作。但是我似乎无法为接口(interface)实现它。想象一下:

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

您可能已经猜到了,我想要类实现 IFoo表现得像一个值类型(至少在比较相等时)。如您所见,具体类型 Foofoo1foo2Assert 时不再“已知”发生。所知道的只是他们的界面IFoo .

我当然可以使用 IEquatable<IFoo>然后写foo1.Equals(foo2)相反,但这不是重点。如果IFoo是一个抽象基类而不是我可以重载的接口(interface) 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==对于一个不可能的界面还是我错过了一个技巧?

最佳答案

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

指定接口(interface)具有非引用相等语义的最佳方法是让它派生自 IEquatable<T> .这绝不是对调用者或实现者的约束性 promise ,而是对两者的暗示。

关于c# - 为接口(interface)重载 operator==,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861260/

相关文章:

c# - C# 中字符串到常量类型

c# - 在 C# 中编辑现有的 Excel 文件。异常

c# - 禁止 dapper.rainbow 在插入时使用 ID

c++ - 重载 + 运算符取一条线(两个坐标*2) + 一个点(两个坐标)

C++:wikibook 中关于重载指针/引用相关运算符的代码无法编译

c# - 提取图像文件元数据

c# - 如何增加原始音频字节的音量/振幅

C++ 模板类运算符,用于括号和等于插入和获取元素

vector - 实现二维向量语法以访问一维向量?

c++ - 错误 : initial value of reference to non-const must be an value