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

时间:2014-07-24 21:11:36

标签: c# lambda task anonymous-methods

我写了以下代码:

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.Result语句在屏幕上打印任务结果。

但Visual Studio在上面代码的第2行显示错误,在goto运算符(=&gt;)之前强调n1:

  

名为&#39; n1&#39;的局部变量不能在这种情况下声明,因为它会给&#39; n1&#39;已经在父母或当前使用过的范围来表示别的东西

我在我的lambda表达sintax中猜错了,我无法理解。 Aren&lt; lambda表达式声明如下:parameters =&gt;表达?我知道我正在声明一个匿名表达式,我不想给出一个int变量,然后通过=&gt;运算符使用相同的变量来运行函数,但Visual Studio认为我试图声明一个新的n1变量,而实际上我只想将它用作参数。另外,在弄乱代码的时候,我注意到为了解决这个问题而改变第2行:

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

我知道我可以这样离开,但我想知道我的lambda表达有什么不对,它不会让我发送任何参数

1 个答案:

答案 0 :(得分:2)

编译错误确切地说明了您做错了什么 - 您尝试将名称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