3

MyMethodDelegate有什么方法可以避免在这种情况下明确声明?

bool MyMethod(string x)
{
    //...
}

BeginInvoke(new MyMethodDelegate(MyMethod), x);

我知道 lambdas a-la ()=>MyMethod(x),但是有时我想避免它们,因为它们会破坏编辑并继续。

编辑:只是BeginInvoke(MyMethod, x)不起作用:

The best overloaded method match for 'System.Windows.Forms.Control.BeginInvoke(System.Delegate, params object[])' has some invalid arguments
Argument 1: cannot convert from 'method group' to 'System.Delegate'
Argument 2: cannot convert from 'string' to 'object[]'

BeginInvoke 定义如下:

public IAsyncResult BeginInvoke(Delegate method, params object[] args);

它没有指定任何特定的委托类型,因此编译器无法检测从哪个委托类型实例化BeginInvoke(MyMethod. x)

4

2 回答 2

5

对于 framework >= 3.5,您可以使用预定义的委托 Action<> 和 Func<> (在您的情况下)

    BeginInvoke(new Func<int, bool>(MyMethod), x);

Func 文档 http://msdn.microsoft.com/ru-ru/library/bb549151.aspx

于 2012-12-07T10:27:26.860 回答
3

您可以经常使用简化版

MyMethod

当需要委托时。关键字通常是.

但是,如果编译器无法确定要将方法组转换为哪种类型的委托,您将不得不帮助进行显式转换

当您希望传递尚未定义且在代码的其他位置不需要的函数时,Lambda 可以派上用场。然后 Lambdas(以及一般的匿名函数)将非常方便,因为您可以在需要的地方简单地定义函数。

在 BeginInvoke 的情况下,您是正确的,如注释中所述,您不能通过强制转换或分配将方法组显式转换为委托

Func<int,bool) m = MyMethod;
BeginInvoke(m,x);
BeginInvoke((Func<inte,bool>)MyMethod,x);

将编译,或者您可以传入一个 lambda,因为它被解释为 Func

BeginInvoke(a=>MyMethod(a),x);
于 2012-12-07T09:58:31.610 回答