【问题标题】:Why don't I see the += operator overloaded on System.Delegate?为什么我没有看到 System.Delegate 上的 += 运算符重载?
【发布时间】:2015-02-08 06:54:26
【问题描述】:

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

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

【问题讨论】:

标签: c#


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

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

    += Operator (C# Reference)

    【讨论】:

    • 好点,但我什至看不到类中的加法或减法运算符。
    • @WaterCoolrv2:委托类型和数组类型一样,有点“不同”,因为运行时会自动生成各种成员。您不会在类库文档中看到它们。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-06
      • 2011-01-21
      • 2016-06-19
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 2014-03-22
      相关资源
      最近更新 更多