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

26
为什么C#要求操作符重载必须是静态方法而不是成员函数(像C++那样)?(更具体地说:这个决定的设计动机是什么?)

1
C++允许运算符作为自由函数(即非成员函数)。但是C#决定对自由函数实行斯大林式的禁令,因此您必须在那里放置static。 - Alexandre C.
3个回答

37

这个问题已经被Eric Lippert在一篇详细的博客文章中回答过,但该文章现已被删除。这里是存档版本

关于值类型和实例操作符还有另一个更微妙的点。静态操作符使得这种代码成为可能:

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;

因此,即使引用为空,您仍然可以调用运算符。这在实例运算符的情况下不适用。


1
我会给@Sapph一个绿色勾选标志,因为你的声望要高得多 :) - dkackman
我看到声望值上升了一秒钟,然后又下降了。Sapph的回答非常值得,他付出了更多的努力。 - Igor Zevaka
2
在我看来,不要这样做。看起来设计有问题,因为这种行为似乎是意料之外的。 - LOST

28

请看此文章

原因有几个,主要的似乎是为了保持运算符对称性(使二元操作的左操作数不会受到特殊处理,因为它负责分派操作)。


1
@Frederic 在这里,您可以找到 https://web.archive.org/web/20150906063729/http://blogs.msdn.com/b/ericlippert/archive/2007/05/14/why-are-overloaded-operators-always-static-in-c.aspx 的内容。 - Rain

0
也许最好思考一下为什么这些方法不应该是静态的。没有状态,因此不需要这样做。

可能没有状态的好处,但是拥有虚拟运算符重载会很酷。状态不是C#中不可用的原因。 - Noel Widmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接