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



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

那么递增赋值和递减赋值运算符是如何处理委托实例的呢?

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

当编译器做这样的事情时,有几种情况,例如System.String+运算符被编译为String.Concat调用。因此System.String中没有op_Add方法。

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

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

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

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

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

最新更新