2010-01-07 154 views
19

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

+0

C++允许运营商免费(即非会员)功能。但是C#决定放弃对免费功能的斯大林禁令,所以你必须在那里放置静态。 – 2011-08-29 19:36:27

回答

26

看看this post

几个原因,主要似乎是保护运营商的对称性(使得二元运算的左侧没有得到特殊待遇,负责调度的操作)。

30

回答这里难以忍受的细节:

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; 

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

+0

要给绿色支票@Sapph只是因为你已经waaaay更多的代表:) – dkackman 2010-01-07 04:09:32

+0

哈哈我看到代表上去,然后下来了一秒钟。 Sapph当之无愧地回答了这个问题。 – 2010-01-07 04:12:02

+3

对于优秀的代码片段+1:D – Sapph 2010-01-07 07:18:29

0

也许最好的想法是为什么这些方法不是静态的。没有需要国家,因此这。

+0

可能没有国家利益,但虚拟运营商超载会很酷。状态不是它在C#中不可用的原因。 – 2017-03-17 20:56:05