我在==
和!=
上看到了相等比较运算符System.Delegate
和MulticastDelegate
,但+=
和-=
运算符没有重载。< / p>
那么增量分配和减量赋值运算符如何处理委托实例?
答案 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)
+=
运算符来自+
运算符。
答案 3 :(得分:0)
当您将委托声明为event
时,它实际上是委托周围的事件包装器。有关详细信息,请参阅https://stackoverflow.com/a/4893006/397807。简而言之,您只能使用+=
添加处理程序并使用-=
删除,编译器将帮助将其转换为正确的函数调用。