运算符在c#中重载约束

时间:2012-12-07 17:18:06

标签: c# operator-overloading

问:为什么'公共'&在C#中运算符重载需要'static'吗?

试过这篇文章

http://blogs.msdn.com/b/ericlippert/archive/2007/05/14/why-are-overloaded-operators-always-static-in-c.aspx

但有人能解释一下作者试图说的话吗?

2 个答案:

答案 0 :(得分:2)

作者以非静态的方式对运营商重载的潜在特征进行了简单的成本/收益分析,并得出结论:收益并不能证明成本合理:您可以通过调度轻松模拟运营商实例重载的功能从静态重载运算符内部的虚方法。但是,让您在没有中间虚函数的情况下定义重载运算符的成本非常高:

  • 您在操作员的工作方式中引入了不对称性(2+c可能是非法的,而c+2可以)
  • 您需要处理左侧的null引用
  • 单一调度无论如何也无法解决您的问题,因此您最终会在运营商内部进行额外的调度工作

最后,作者指出,他们没有引入一个引入很多混乱而没有显着优势的功能,而是采用了更清晰的设计,可以扩展以提供相应级别的功能。

答案 1 :(得分:0)

公共是必要的,以便可以在课外访问它。 静态是必要的,因为没有在类的实例上调用它。

public class B {
    public static B operator+(B b1, B b2) { return b1.Add(b2); }
    protected virtual B Add(B b2) { // ...

对于上面的例子,我可以使用像b3 = b1 + b2这样的代码,这里+运算符不会在B类的任何一个实例上调用,所以它需要是静态的。 希望这会有所帮助。