C# 如何使动作与事件的委托类型兼容?
鉴于以下代码:C# 如何使动作与事件的委托类型兼容?,c#,events,delegates,compatibility,action,C#,Events,Delegates,Compatibility,Action,鉴于以下代码: void LookupBox_Load(object sender, EventArgs e) { Action d = delegate { if (!_p.AutoClose) CloseLookupBox(); }; if (this.ParentForm.MdiParent != null) this.ParentForm.MdiParent.Deac
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(); };
}
有没有办法省略委托{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;
}
注意:我不想做得更好,但是如果您使用的是C 3.0:
if (this.ParentForm.MdiParent != null)
this.ParentForm.MdiParent.Deactivate += (x,y) => d();
else
this.ParentForm.Deactivate += (x,y) => d();
不是更好,但是如果您使用的是C 3.0,您可以做到:
if (this.ParentForm.MdiParent != null)
this.ParentForm.MdiParent.Deactivate += (x,y) => d();
else
this.ParentForm.Deactivate += (x,y) => d();
您应该使用来定义这些,而不是操作委托
EventHandler<EventArgs> d = delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};
您应该使用来定义这些,而不是操作委托
EventHandler<EventArgs> d = delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};
绝对-将d的类型更改为从以下内容开始:
EventHandler d = delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};
匿名方法不仅仅适用于Func和Action
不过,为了便于将来参考,您可以基于具有兼容签名的现有委托创建新委托:
Action<object, EventArgs> d = ...;
EventHandler handler = new EventHandler(d);
由于只使用了一次d,因此可以将其内联,将整个方法转化为:
Form form = ParentForm.MdiParent ?? ParentForm;
form.Deactivate += delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};
绝对-将d的类型更改为从以下内容开始:
EventHandler d = delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};
匿名方法不仅仅适用于Func和Action
不过,为了便于将来参考,您可以基于具有兼容签名的现有委托创建新委托:
Action<object, EventArgs> d = ...;
EventHandler handler = new EventHandler(d);
由于只使用了一次d,因此可以将其内联,将整个方法转化为:
Form form = ParentForm.MdiParent ?? ParentForm;
form.Deactivate += delegate
{
if (!_p.AutoClose)
CloseLookupBox();
};
哎呀,你说得对;他使用的是香草事件处理程序,所以我猜不需要通用的。使用泛型会导致性能方面的任何损失吗?您必须使用正确的类型进行订阅,因此您必须创建一个非泛型实例…+1 for null coalesce操作符建议。你的大脑真的能捕捉到每一个节目的意图;他使用的是香草事件处理程序,所以我猜不需要通用的。使用泛型会导致性能方面的任何损失吗?您必须使用正确的类型进行订阅,因此您必须创建一个非泛型实例…+1 for null coalesce操作符建议。你的大脑可以真正了解每个程序的意图。