为什么我没有在System.Delegate上看到+ =运算符重载?

时间:2015-02-08 06:54:27

标签: c#

我在==!=上看到了相等比较运算符System.DelegateMulticastDelegate,但+=-=运算符没有重载。< / p>

那么增量分配和减量赋值运算符如何处理委托实例?

4 个答案:

答案 0 :(得分:6)

C#编译器将+=运算符转换为静态方法Delegate.Combine的调用。

编译器执行此类操作时有几种情况,例如: +的{​​{1}}运算符已编译为System.String调用。因此,String.Concat中没有op_Add方法。

答案 1 :(得分:1)

加法运算符和委托的复合赋值(+ =)运算符都是由c#编译器内置支持的。 'C#语言规范' 表示:

  

代表组合。每个委托类型都隐式提供以下预定义运算符,其中D是委托类型:   D运算符+(D x,D y);   当两个操作数都是某个委托类型D时,binary +运算符执行委托组合。(如果操作数具有不同的委托类型,则发生绑定时错误。)如果第一个操作数为null,则操作的结果为值第二个操作数(即使它也为null)。否则,如果第二个操作数为null,则操作的结果是第一个操作数的值。否则,操作的结果是一个新的委托实例,在调用时,调用第一个操作数,然后调用第二个操作数。有关委托组合的示例,请参见§7.8.5和§15.4。由于System.Delegate不是委托类型,因此没有为它定义operator +。

答案 2 :(得分:0)

+=运算符来自+运算符。

请参阅+= Operator (C# Reference)

答案 3 :(得分:0)

当您将委托声明为event时,它实际上是委托周围的事件包装器。有关详细信息,请参阅https://stackoverflow.com/a/4893006/397807。简而言之,您只能使用+=添加处理程序并使用-=删除,编译器将帮助将其转换为正确的函数调用。