靜態解析重載運算符的原因是什麼?對我來說這似乎是一個奇怪的選擇 - 我能想到的唯一優點是性能上的小增益(但JIT可能有時會避免這種情況),代價是一些相當不直觀的行爲 - 也就是說,我基本上必須將運營商轉移到一個虛擬函數來獲得想要的行爲。運算符重載 - 爲什麼靜態解析?
這是剛從C++接管,還是有一些其他原因呢?
靜態解析重載運算符的原因是什麼?對我來說這似乎是一個奇怪的選擇 - 我能想到的唯一優點是性能上的小增益(但JIT可能有時會避免這種情況),代價是一些相當不直觀的行爲 - 也就是說,我基本上必須將運營商轉移到一個虛擬函數來獲得想要的行爲。運算符重載 - 爲什麼靜態解析?
這是剛從C++接管,還是有一些其他原因呢?
見埃裏克Lipperts文章Why are overloaded operators always static in C#?
相反,我們應該問自己,當與潛在的語言特性面臨的這個問題:「請問功能的誘人的好處證明所有的費用?」成本遠遠超過設計,開發,測試,記錄和維護功能的普通美元成本。還有更多微妙的成本,比如,這個功能會使得將來更改類型推理算法更加困難嗎?這是否會導致我們進入一個沒有引入向後兼容性中斷的環境,我們將無法進行更改?等等。
在這種特殊情況下,令人信服的好處很小。如果您想在C#中使用虛擬調度的重載操作符,則可以非常輕鬆地從靜態部分構建一個操作符。 [...]
它可以支持基於實例運營,但C#語言的設計者並沒有看到大的收益相比,使其正常工作所需要的努力。
考慮將運算符重載爲引用類型的情況。它可以是運營商兩側的null
。
如果操作符是實例方法,它們將不起作用。
但斯卡拉允許「運算符重載「在引用類型上:`x * y`與解析後的Scala中的`x.multiply(y)`沒有區別。 – 2011-12-15 21:03:11
有兩件事情來了我的頭頂,其中任一個會恕我直言,足以本身打破了這筆交易:
virtual
方法僅基於this
的運行時類型進行調度。
「設計決定」..現在,Eric在哪裏? ;-)另一個有點相關的問題是「爲什麼不默認虛擬方法」? – 2011-12-15 21:01:04
他在這裏: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