2015-02-08 47 views
4

我看到等效比較運算符==!=超載於System.DelegateMulticastDelegate但不是+=-=運算符。爲什麼我在System.Delegate上看不到+ =運算符?

那麼增量分配和減量賦值操作符如何在委託實例上工作?

+1

另請參閱[+ =代理操作員](http://stackoverflow.com/q/33964927/1364007),它已被標記爲此副本的[重複]。 – 2016-01-06 14:07:04

+0

@WaiHaLee謝謝。我做到了。 :-) – 2016-01-07 06:48:10

回答

5

C#編譯器將+=運算符轉換爲靜態方法Delegate.Combine的調用。

有幾種情況,當編譯器做這樣的事情,f.e. System.String+運算符被編譯爲String.Concat調用。因此System.String中沒有op_Add方法。

0

+=運營商是從+運營商推斷。

+= Operator (C# Reference)

+0

好點,但我甚至沒有看到類中的加法或減法運算符。 – 2015-02-08 06:58:07

+0

@ WaterCoolerv2:委託類型,如數組類型,有點「不同」,因爲運行時會自動生成各種成員。你不會在類庫文檔中看到它們。 – 2015-02-08 06:59:17

0

在聲明委託爲event,它實際上是圍繞着委託的事件包裝。詳情請參閱https://stackoverflow.com/a/4893006/397807。簡而言之,你只能添加一個處理程序+=並刪除與-=和編譯器將幫助翻譯它適當的函數調用。

1

加法運算符和代表的化合物賦值(+ =)運算符都內置由C#支持compiler.As的 「C#語言規範」 說:

委託組合。每個委託類型隱式提供以下預定義的運算符,其中D是委託類型: D運算符+(D x,D y); 如果兩個操作數都是某個委託類型D,則二元+運算符會執行委託組合。(如果操作數具有不同的委託類型,則會發生綁定時錯誤。)如果第一個操作數爲null,則操作的結果爲值第二個操作數(即使它也是null)。否則,如果第二個操作數爲空,那麼操作的結果就是第一個操作數的值。否則,操作的結果是一個新的委託實例,當它被調用時,調用第一個操作數,然後調用第二個操作數。有關委託組合的示例,請參見第7.8.5節和第15.4節。由於System.Delegate不是委託類型,因此未定義operator +。

+0

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

+0

非常感謝。 – 2016-01-06 09:18:57

相關問題