gpt4 book ai didi

c# - 如何使 Action 与事件的委托(delegate)类型兼容?

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:03 25 4
gpt4 key购买 nike

给定以下代码:

void LookupBox_Load(object sender, EventArgs e)
{
Action d = delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};

if (this.ParentForm.MdiParent != null)
this.ParentForm.MdiParent.Deactivate += delegate { d(); };
else
this.ParentForm.Deactivate += delegate { d(); };
}

有没有办法省略委托(delegate) { d(); } ?

void LookupBox_Load(object sender, EventArgs e)
{
Action<object,EventArgs> d = delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};

if (this.ParentForm.MdiParent != null)
this.ParentForm.MdiParent.Deactivate += d;
else
this.ParentForm.Deactivate += d;
}

注意:我想内联执行此操作

最佳答案

绝对 - 更改 d 的类型以开始:

EventHandler d = delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};

匿名方法不仅仅适用于 Func 和 Action...

不过,为了将来引用,您可以基于具有兼容签名的现有委托(delegate)创建一个新委托(delegate):

Action<object, EventArgs> d = ...;
EventHandler handler = new EventHandler(d);

但是在这种情况下这种额外的间接寻址是没有意义的:)

您还可以使用空合并运算符使调用它的代码稍微简单一些:

Form form = ParentForm.MdiParent ?? ParentForm;
form.Deactivate += d;

因为你只使用了一次d,你可以内联它,把整个方法变成:

Form form = ParentForm.MdiParent ?? ParentForm;
form.Deactivate += delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};

关于c# - 如何使 Action<param,param2> 与事件的委托(delegate)类型兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1576415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com