有人可以解释为什么不允许C#接口包含运营商吗?
感谢。
答案 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 ==确实是一个糟糕的主意。每个接口==运算符的作者假定,对象进行比较时,唯一重要的方面是接口所包含的那些方面。有时候这可能是正确的,但通常不是正确的。
这就是为什么只在密封类上使用运算符的原因。只有这样,您才能确保操作员充分了解该对象,以使其正常工作。