【问题标题】:Subscribing to events using anonymous methods使用匿名方法订阅事件
【发布时间】:2014-10-27 01:24:40
【问题描述】:

我在理解以下如何工作时遇到问题(代码下方的问题):

private delegate void MyDelegate(int i);
private event MyDelegate myEvent;

public void EventTests() {
    //Option One
    myEvent += One;

    //Option Two
    myEvent += delegate{ Two(true); };

    //Option Three
    myEvent += () => { Two(true); };
}

private void One(int i) { }

private void Two(bool j) { }

问题:

  1. 我可以理解为什么选项一有效,因为事件 myEvent 期望附加一个带有 int 参数的委托。为什么选项二有效?它在事件中附加了一个签名不正确的匿名方法,不是吗?

  2. 如果选项二有效,为什么选项三无效?似乎签名需要是(int i) => { Two(true); };,而不是上面写的()。但是选项二在没有正确签名的情况下工作,那么为什么这个匿名方法会导致错误?

非常感谢。

【问题讨论】:

    标签: c# events delegates anonymous-function


    【解决方案1】:

    选项二有效,因为当参数列表被省略时,编译器会自动计算出函数签名是什么。将() 添加到delegate 关键字后,您就定义了一个具体的参数列表none,编译器会抛出一个合适的参数。

    选项三是一个定义了错误参数列表的 lambda 表达式。

    微软的C# Programming Guide 声明:

    在一种情况下,匿名方法提供了 lambda 表达式中没有的功能。匿名方法使您能够省略参数列表。这意味着可以将匿名方法转换为具有各种签名的委托。这对于 lambda 表达式是不可能的。

    【讨论】:

      猜你喜欢
      • 2010-11-19
      • 2011-09-12
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2020-01-31
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多