C# 使用匿名方法订阅事件

C# 使用匿名方法订阅事件,c#,events,delegates,anonymous-function,C#,Events,Delegates,Anonymous Function,我在理解下面的工作原理时遇到问题(代码下面的问题): 问题: 我可以理解为什么选项一起作用,因为事件myEvent需要附加一个带有int参数的委托。为什么选项二能起作用?它正在将签名不正确的匿名方法附加到事件,不是吗 那么,如果方案二可行,为什么方案三不可行呢?似乎签名需要是(inti)=>{Two(true);}而不是上面写的()。但是选项二在没有正确签名的情况下工作,那么为什么这个匿名方法会导致错误呢 非常感谢。选项二起作用,因为当省略参数列表时,编译器会自动计算出函数签名是什么。将()添加

我在理解下面的工作原理时遇到问题(代码下面的问题):

问题:

  • 我可以理解为什么选项一起作用,因为事件
    myEvent
    需要附加一个带有int参数的委托。为什么选项二能起作用?它正在将签名不正确的匿名方法附加到事件,不是吗

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


  • 非常感谢。

    选项二起作用,因为当省略参数列表时,编译器会自动计算出函数签名是什么。将
    ()
    添加到delegate关键字后,您已经定义了一个特定的参数列表none,编译器将抛出一个fit

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

    微软的声明:

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

    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) { }