2011-12-15 127 views
2

靜態解析重載運算符的原因是什麼?對我來說這似乎是一個奇怪的選擇 - 我能想到的唯一優點是性能上的小增益(但JIT可能有時會避免這種情況),代價是一些相當不直觀的行爲 - 也就是說,我基本上必須將運營商轉移到一個虛擬函數來獲得想要的行爲。運算符重載 - 爲什麼靜態解析?

這是剛從C++接管,還是有一些其他原因呢?

+4

「設計決定」..現在,Eric在哪裏? ;-)另一個有點相關的問題是「爲什麼不默認虛擬方法」? – 2011-12-15 21:01:04

+3

他在這裏:http://blogs.msdn.com/b/ericlippert/archive/2007/05/14/why-are-overloaded-operators-always-static-in-c.aspx – 2011-12-15 21:03:29

回答

2

見埃裏克Lipperts文章Why are overloaded operators always static in C#?

相反,我們應該問自己,當與潛在的語言特性面臨的這個問題:「請問功能的誘人的好處證明所有的費用?」成本遠遠超過設計,開發,測試,記錄和維護功能的普通美元成本。還有更多微妙的成本,比如,這個功能會使得將來更改類型推理算法更加困難嗎?這是否會導致我們進入一個沒有引入向後兼容性中斷的環境,我們將無法進行更改?等等。

在這種特殊情況下,令人信服的好處很小。如果您想在C#中使用虛擬調度的重載操作符,則可以非常輕鬆地從靜態部分構建一個操作符。 [...]

它可以支持基於實例運營,但C#語言的設計者並沒有看到大的收益相比,使其正常工作所需要的努力。

2

考慮將運算符重載爲引用類型的情況。它可以是運營商兩側的null

如果操作符是實例方法,它們將不起作用。

+1

但斯卡拉允許「運算符重載「在引用類型上:`x * y`與解析後的Scala中的`x.multiply(y)`沒有區別。 – 2011-12-15 21:03:11

2

有兩件事情來了我的頭頂,其中任一個會恕我直言,足以本身打破了這筆交易:

  1. 哪個運營商?二進制運算符有兩個操作數,並且動態調度基於兩個參數的類型不可用! 「經典」virtual方法僅基於this的運行時類型進行調度。
  2. 什麼是用例證明額外的複雜性?