请考虑以下事项:
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表达式的情况下传入委托调用?
我错过了什么?
答案 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。