2010-01-07 158 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