为什么C#运算符重载必须是静态的?

dka*_*man 21 c# c++ static language-design operator-overloading

为什么C#需要运算符重载是静态方法而不是成员函数(如C++)?(也许更具体地说:这个决定的设计动机是什么?)

Igo*_*aka 33

这里以极其痛苦的细节回答:

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

关于值类型和实例运算符还有另一个微妙的观点.静态运算符使这种代码成为可能:

class Blah {

    int m_iVal;

    public static Blah operator+ (Blah l, int intVal)
    {
        if(l == null)
            l = new Blah();
        l.m_iVal += intVal;
        return l;
    }
}

//main
Blah b = null;
b = b + 5;
Run Code Online (Sandbox Code Playgroud)

因此,即使引用为null,也可以调用运算符.例如,运营商不会这样.

  • 恕我直言,不要这样做。看起来是一个糟糕的设计,因为这种行为似乎是意外的。 (2认同)

Sap*_*pph 27

看看这篇文章.

有几个原因,主要似乎是保持操作员的对称性(这样二进制操作的左侧不会得到特殊处理,因为负责调度操作).