c# - 将没有签名的委托(delegate)分配给 EventHandler - 这是如何工作的?

标签 c# delegates event-handling

如果我这样做:

EventHandler foobar = new EventHandler(fooMethod);

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

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

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

EventHandler foo = delegate { };

这是怎么回事?我本以为我需要这样做:

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

顺便说一句,上面这行确实有效。我只是对如何将“空”委托(delegate)分配给 EventHandler 感到困惑。

感谢任何能照亮我的人!

最佳答案

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

delegate (parameter list)
{
    // body
}

delegate
{
    // body
}

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

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

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

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

关于c# - 将没有签名的委托(delegate)分配给 EventHandler - 这是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5269701/

相关文章:

c# - 我应该在 vb.net 中使用只读属性还是带有私有(private)集的属性?

c# - ThreadPool 给出了惊人的结果,我这样做对吗? (不,我没有)

c# - 是否可以将代理与 LinqToTwitter 库一起使用?

c# - 为什么在 C# 中不允许部分委托(delegate)?

objective-c - iOS:释放正在使用的对象 (ARC)

ios - 是否可以共享委托(delegate),或将协议(protocol)的方法重新委托(delegate)给另一个委托(delegate)?

c++ - 回调函数中的参数顺序

c# - 上下文菜单项的事件处理程序

java - 如何将工具提示显示/激活属性绑定(bind)到焦点事件而不是 JavaFX2 中的悬停事件?

c# - 如何知道我的 DirectoryEntry 是否真的连接到我的 LDAP 目录?