【问题标题】:C# - automatic delegate type from methodC# - 来自方法的自动委托类型
【发布时间】:2012-12-07 09:56:57
【问题描述】:

有什么方法可以避免在这种情况下明确声明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)实例化哪个委托类型

【问题讨论】:

    标签: c# methods delegates invoke


    【解决方案1】:

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

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

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

    【讨论】:

    • 打败我。尽管根据 OP,int 应该是 string
    【解决方案2】:

    你可以经常使用简化版

    MyMethod
    

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

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

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

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

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

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

    BeginInvoke(a=>MyMethod(a),x);
    

    【讨论】:

    • 不起作用,因为 BeginInvoke() 需要一个通用委托。更新帖子。
    • @IvanShcherbakov 你写过你不能将 MyMethod 作为一个接受 no 参数的委托传递,这是真的,因为 MyMethod 接受一个。我已经很久没有写“BeginInvoke”了,但如果你真的传递了一个参数,我希望它会起作用
    • 为简单起见,我将其省略了。我显然已经在实际代码中传递了它。
    • @Ivan 你所做的事情与你所说的你实际所做的事情并没有什么明显的不同:)
    • 好的,抱歉。我认为很明显问题出在从 MyMethod 到委托的转换中,而不是在下面的“params object [] args”中。尽管如此,它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多