我写了以下代码:
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表达有什么不对,它不会让我发送任何参数
答案 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
。