Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使动作与事件的委托类型兼容?_C#_Events_Delegates_Compatibility_Action - Fatal编程技术网

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操作符建议。你的大脑可以真正了解每个程序的意图。