【问题标题】:assigning a delegate with no signature to an EventHandler - how does this work?将没有签名的委托分配给 EventHandler - 这是如何工作的?
【发布时间】:2011-03-11 06:29:29
【问题描述】:

如果我这样做:

EventHandler foobar = new EventHandler(fooMethod);

fooMethod 必须是具有以下签名的方法:

public void fooMethod(object obj, EventArgs args){}

对我来说很有意义。但是,这段代码工作得很好:

EventHandler foo = delegate { };

这是怎么回事?我会认为我需要这样做:

EventHandler foo = delegate(object obj, EventArgs arg) { };

上面的行确实有效。我只是对如何将“空”委托分配给 EventHandler 感到困惑。

感谢任何能照亮我的人!

【问题讨论】:

    标签: c# delegates event-handling


    【解决方案1】:

    匿名方法(通过delegate { /* body */ }构造委托的方式有两种形式:

    delegate (parameter list)
    {
        // body
    }
    

    delegate
    {
        // body
    }
    

    假设返回值与委托类型的返回类型匹配,则第二种形式可以转换为不使用out 参数的任何委托类型(IIRC - 它可能也无法处理ref)。例如:

    Func<int> foo = delegate { return 5; };
    

    如果你不关心参数,这个表格很方便。请注意,它增加了表达式可以转换为的委托类型的数量,这可能会混淆重载:

    new Thread(delegate { Console.WriteLine("Error - ambiguous"); });
    new Thread(delegate() { Console.WriteLine("Fine - ThreadStart"); });
    new Thread(delegate(object state) {
        Console.WriteLine("Fine - ParameterizedThreadStart");
    });
    

    【讨论】:

    • 刚刚验证了第二种形式可以处理ref参数,但不能处理out。这有点意思,因为我认为 CLR 只支持 ref 参数,而 out 参数只是建立在 ref 参数之上的 C# 构造。
    • @Harry:重要的区别在于 C# 保证方法中的 out 参数会发生什么。我想 C# 编译器可以生成代码来为其分配一个默认值 - 但我认为最好不要这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多