我看到相等比较运算符==
和!=
在System.Delegate
和MulticastDelegate
上重载,但没有看到+=
和-=
运算符。
那么递增赋值和递减赋值运算符是如何处理委托实例的呢?
+=
运算符转换为静态方法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详细信息。简而言之,您只能用+=
添加处理程序,用-=
删除处理程序,编译器将帮助将其转换为正确的函数调用。