C#接口不能包含运算符

时间:2011-07-06 22:45:08

标签: c# interface operators static-methods

有人可以解释为什么不允许C#接口包含运营商吗?

感谢。

2 个答案:

答案 0 :(得分:52)

C#operators have to be static。根据定义,接口适用于实例。没有机制要求类型来实现静态方法。

答案 1 :(得分:0)

您不能在接口上定义运算符,因为一个类可以实现多个接口。试想一下这段代码是否可行:

static class Fooness {
  public static operator==(IFoo l, IFoo r) { ... }
}
static class Barness {
  public static operator==(IBar l, IBar r) { ... }
}

public class Foobar : IFoo, IBar { ... }

如果在Foobar实例上使用哪种==实现应该优先? (在回答之前,请假设IFoo / Fooness是否来自一个DLL而IBar / Barness是否来自另一个DLL。)

即使您能以某种方式解决这种歧义,我们也应该自问,这是否是一个好主意。我希望以上内容表明,使用operator ==确实是一个糟糕的主意。每个接口==运算符的作者假定,对象进行比较时,唯一重要的方面是接口所包含的那些方面。有时候这可能是正确的,但通常不是正确的。

这就是为什么只在密封类上使用运算符的原因。只有这样,您才能确保操作员充分了解该对象,以使其正常工作。