为什么我看不到System.Delegate上的+ =运算符重载?

我看到在System.DelegateMulticastDelegate上的等式比较运算符==!=重载,而不是+=-=运算符。

那么增量分配和减量赋值运算符如何在委托实例上工作?

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

在编译器执行此类操作时,有几种情况,即System.String+运算符被编译为String.Concat调用。 因此System.String没有op_Add方法。

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

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

+=运算符是从+运算符推断出来的。

见+ =运算符(C#参考)

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