C#委托Lambda

时间:2017-02-08 15:35:02

标签: c# lambda delegates

请考虑以下事项:

private static string Sub(int anInt)
{
    return anInt.ToString();
}

private static void Test()
{
    const int anInt = 100;

    Func<int,string> aFunc = Sub;

    //why does Task<string> task = Task.Run(aFunc(anInt)); not compile?
    Task<string> task = Task.Run(() => aFunc(anInt));

    Console.WriteLine(task.Result);
}

此代码编译良好。为什么这行

Task<string> task = Task.Run(aFunc(anInt));

不编译?

有没有办法在没有Lambda表达式的情况下传入委托调用?

我错过了什么?

3 个答案:

答案 0 :(得分:0)

错误状态

  

无法转换为&#39; string&#39;到&#39; System.Action&#39;

通过传递aFunc(anInt)你基本上传递了方法调用的结果 - 一个字符串。可以这样想 - 如果您在Func变量的名称后面输入() - 您就在现场执行它。

如果你想传递一个带有参数的Func,你必须按照你为它编写的方式完全相同的方式:

Task<string> task = Task.Run(() => aFunc(anInt));

...因为这会将您的调用包装在一个新的可执行文件中,然后运行。

查看this answer了解详情。

答案 1 :(得分:0)

让我们分析这一行:

Task<string> task = Task.Run(aFunc(anInt));

此行无法编译,因为编译器将aFunc(anInt)理解为&#34; 执行aFunc(anInt),然后在调用Task.Run()时使用其返回值作为参数&#34;

基本上,您正在尝试将字符串强制转换为Task.Run。这相当于尝试这个:

Task<string> task = Task.Run("blah");

以上行将生成完全相同的错误消息。

答案 2 :(得分:0)

您无法这样做,因为您正在调用aFunc而不是引用它。

如果你开始将参数传递给方法,而不是简单地给出它的名字,你就可以调用它。

要引用方法,只提供名称而不传递任何参数。就像你在这里所做的那样:

Func<int,string> aFunc = Sub;

您没有将任何参数传递给Sub,因为您只是说&#34;我的意思是 方法称为Sub& #34;

现在让我们看一下错误的代码:

Task<string> task = Task.Run(aFunc(anInt));

Task.Run采用Action类型的参数,但您将为其返回aFunc的返回值,这是一个字符串。看看为什么它现在产生错误?

你不能说&#34;我的意思是这个方法,用anInt&#34;的参数调用。这根本不可能。你必须为此创建一个lambda。