【发布时间】:2016-10-26 10:36:41
【问题描述】:
假设我的代码中有一个BackgroundWorker。我想在开始时在其中传递匿名函数/委托。下面的代码是我想做的:
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (object sender, DoWorkEventArgs e) => {
Func<string> f = (Func<string>)e.Argument;
f("step one");
...
f("step two");
}
bw.RunWorkerAsync((string txt) => {Console.WriteLine(txt);} ); // doesn't work
// bw.RunWorkerAsync( delegate(string txt) { Console.WriteLine(txt); })); // doesn't work too
错误:
无法将匿名方法转换为类型“对象”,因为它不是 委托类型
或者
无法将 lambda 表达式转换为类型“对象”,因为它不是 委托类型
那么我怎样才能将 lambda 表达式/匿名方法传递给 BackgroundWorker?
这是一个用 C 语言来准确描述我需要的代码:
void func(char *ch)
{
printf("%s", ch);
}
void test( void (* f)(char *) )
{
f("blabla");
}
int main(int argc, char *argv[])
{
test(func);
return 0;
}
【问题讨论】:
-
您的代码有一个
Func<string> f类型,您使用字符串调用它。这不会编译,因为f是一个不接受任何内容并返回字符串的函数。你需要Action<string> f。 -
将其赋值给一个变量并作为参数传递
Action<string> obj = Console.WriteLine; bw.RunWorkerAsync(obj);是的,你需要Action<string>而不是Func<string>
标签: c# lambda backgroundworker