Lambda表达式在创建新任务时发送参数时给出错误

本文关键字:参数 出错 错误 创建 新任务 Lambda 表达式 | 更新日期: 2023-09-27 18:14:36

我写了以下代码:

int n1 = 5
Task<int> myTask = new Task<int>(n1 => lib.MultiplyNumberTimes2(n1));
myTask.Wait();
Console.WriteLine("Result is " + myTask.Result.ToString());

我想让它做什么的代码解释:

我希望这将创建一个名为myTask的新任务,它将接受n1 int变量,并与它一起运行lib。MultipleNumerTimes2方法。然后在等待它完成之后,我将使用myTask在屏幕上打印任务结果。结果语句。

但是Visual studio在我上面的代码的第2行显示了一个错误,在goto操作符(=>)之前的n1下划线显示:

不能在此上下文中声明名为'n1'的局部变量,因为它会赋予'n1'不同的含义,而'n1'已经在'父或当前'作用域中用于表示其他内容

我猜这是我的lambda表达式sintax中的一个错误,我还不能理解。lambda表达式不是像:parameters => expression这样声明的吗?我知道我声明了一个匿名表达式,我不想给一个int变量,然后通过=>操作符使用相同的变量来运行函数,但Visual Studio认为我试图声明一个新的n1变量,而实际上我只是想把它用作参数。此外,当我弄乱代码时,我注意到修改第2行来修复它:

Task<int> myTask = new Task<int>(() => lib.MultiplyNumerTimes2(n1));

我知道我可以让它这样,但我想知道我的lambda表达式出了什么问题,它不允许我向它发送任何参数

Lambda表达式在创建新任务时发送参数时给出错误

编译错误确切地说明了您做错了什么—您试图将名称n1用于两个不同的事情。这里有一个局部变量:

int n1 = 5;

…然后你试图使用它作为你的lambda表达式参数名。您需要使用不同的参数名称…或者直接使用当前的方法,它捕获n1并且没有任何参数。

请注意,Task<TResult>构造函数没有接受Func<T, TResult>的任何重载,因此即使只是更改名称也不起作用:

new Task<int>(foo => lib.MultiplyNumerTimes2(foo));

但是这会,因为它调用接受Func<Object, TResult>的方法,然后为参数提供相关的值。

new Task<int>(foo => lib.MultiplyNumerTimes2((int) foo), n1);

注意转换,因为foo的类型将只是object