label1.Invoke(n => { label1.Text = n.ToString(); }, i); //***出现错误***这里要求无参的改为label1.Invoke(()=>{});应该没错

解决方案 »

  1.   

    因为 Delegate 和 MulticastDelegate 本身都是 abstract 的,实际使用时必须有一个具体的委托继承自它们才能new。前两个例子里面方法的参数都是具体的委托类型,所以编译器可以支持自动new那个类型的委托,就能够直接写lambda。而Invoke要求的参数是 Delegate,你给lambda编译器没法知道要转换成哪一个具体类型的委托,就没法自动帮忙new了,所以必须自己指定好具体的委托类型。一般调用Invoke都是 .Invoke(new Action(() => ...)); 这样用Action这个具体的委托来封装lambda。
      

  2.   


    也可以用强制转换,让编译器有机会推导出具体类型。
    label1.Invoke((Action<int>)(n => { label1.Text = n.ToString(); }), i);