我看到等效比較運算符==
和!=
超載於System.Delegate
和MulticastDelegate
但不是+=
和-=
運算符。爲什麼我在System.Delegate上看不到+ =運算符?
那麼增量分配和減量賦值操作符如何在委託實例上工作?
我看到等效比較運算符==
和!=
超載於System.Delegate
和MulticastDelegate
但不是+=
和-=
運算符。爲什麼我在System.Delegate上看不到+ =運算符?
那麼增量分配和減量賦值操作符如何在委託實例上工作?
C#編譯器將+=
運算符轉換爲靜態方法Delegate.Combine
的調用。
有幾種情況,當編譯器做這樣的事情,f.e. System.String
的+
運算符被編譯爲String.Concat
調用。因此System.String
中沒有op_Add
方法。
+=
運營商是從+
運營商推斷。
好點,但我甚至沒有看到類中的加法或減法運算符。 – 2015-02-08 06:58:07
@ WaterCoolerv2:委託類型,如數組類型,有點「不同」,因爲運行時會自動生成各種成員。你不會在類庫文檔中看到它們。 – 2015-02-08 06:59:17
在聲明委託爲event
,它實際上是圍繞着委託的事件包裝。詳情請參閱https://stackoverflow.com/a/4893006/397807。簡而言之,你只能添加一個處理程序+=
並刪除與-=
和編譯器將幫助翻譯它適當的函數調用。
加法運算符和代表的化合物賦值(+ =)運算符都內置由C#支持compiler.As的 「C#語言規範」 說:
委託組合。每個委託類型隱式提供以下預定義的運算符,其中D是委託類型: D運算符+(D x,D y); 如果兩個操作數都是某個委託類型D,則二元+運算符會執行委託組合。(如果操作數具有不同的委託類型,則會發生綁定時錯誤。)如果第一個操作數爲null,則操作的結果爲值第二個操作數(即使它也是null)。否則,如果第二個操作數爲空,那麼操作的結果就是第一個操作數的值。否則,操作的結果是一個新的委託實例,當它被調用時,調用第一個操作數,然後調用第二個操作數。有關委託組合的示例,請參見第7.8.5節和第15.4節。由於System.Delegate不是委託類型,因此未定義operator +。
heh - 這是[Jon Skeet](http://stackoverflow.com/users/22656/jon-skeet)表示爲[答案](http://stackoverflow.com/a/33964976/1364007)至[這個重複的問題](http://stackoverflow.com/q/33964927/1364007)。 – 2016-01-06 09:14:32
非常感謝。 – 2016-01-06 09:18:57
另請參閱[+ =代理操作員](http://stackoverflow.com/q/33964927/1364007),它已被標記爲此副本的[重複]。 – 2016-01-06 14:07:04
@WaiHaLee謝謝。我做到了。 :-) – 2016-01-07 06:48:10