【发布时间】:2015-02-08 06:54:26
【问题描述】:
我看到相等比较运算符 == 和 != 在 System.Delegate 和 MulticastDelegate 上重载,但不是 += 和 -= 运算符。
那么递增赋值和递减赋值运算符是如何作用于委托实例的呢?
【问题讨论】:
标签: c#
我看到相等比较运算符 == 和 != 在 System.Delegate 和 MulticastDelegate 上重载,但不是 += 和 -= 运算符。
那么递增赋值和递减赋值运算符是如何作用于委托实例的呢?
【问题讨论】:
标签: c#
C# 编译器将+= 运算符转换为静态方法Delegate.Combine 的调用。
编译器会做这样的事情有几种情况,例如。 System.String 的 + 运算符编译为 String.Concat 调用。因此System.String 中没有op_Add 方法。
【讨论】:
委托的加法运算符和复合赋值(+=)运算符都是 c# 编译器内置的。 'C# 语言规范' 说:
委托组合。每个委托类型都隐式提供以下预定义运算符,其中 D 是委托类型: D 运算符 +(D x, D y); 当两个操作数都属于某个委托类型 D 时,二元 + 运算符执行委托组合。(如果操作数具有不同的委托类型,则会发生绑定时错误。)如果第一个操作数为 null,则操作的结果是第二个操作数(即使它也是空的)。否则,如果第二个操作数为空,则运算结果为第一个操作数的值。否则,操作的结果是一个新的委托实例,当被调用时,它会调用第一个操作数,然后调用第二个操作数。有关委托组合的示例,请参见 §7.8.5 和 §15.4。由于 System.Delegate 不是委托类型,因此没有为它定义运算符 +。
【讨论】:
+= 运算符是从 + 运算符推断而来的。
【讨论】:
当您将委托声明为event 时,它实际上是委托周围的事件包装器。有关详细信息,请参阅https://stackoverflow.com/a/4893006/397807。简而言之,您只能使用+= 添加处理程序并使用-= 删除处理程序,编译器将帮助将其转换为正确的函数调用。
【讨论】: