【问题标题】:Lambda expression gives error while sending parameters while creating a new TaskLambda 表达式在创建新任务时发送参数时出错
【发布时间】:2014-09-16 14:50:48
【问题描述】:

我写了以下代码:

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 运算符 (=>) 之前的 n1 下划线:

不能在此上下文中声明名为“n1”的局部变量,因为它会赋予“n1”不同的含义,后者已在“父或当前”范围内用于表示其他内容

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

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

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

【问题讨论】:

    标签: c# lambda task anonymous-methods


    【解决方案1】:

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

    int n1 = 5;
    

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

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

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

    但这会,因为它调用接受Func&lt;Object, TResult&gt;的方法,然后为参数提供相关值。

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

    请注意演员表,因为foo 的类型将只是object

    【讨论】:

    • 我理解错误,但这不是 lambda 表达式的工作原理吗?我认为 lambda 表达式就像编写匿名方法,其中:method (int myInt) { myInt*2 } 变成:myInt => myInt*2 我不想声明一个新变量,是不是我不允许只发送参数就像我会在一个方法?我的意思是,我想将 n1 作为参数发送,尽管我也可以使用我找到的那个 quickfix,但我认为正确的做法是正确发送参数。如果它要求我更改它的名称,我不明白我应该如何发送参数。
    • @sgarcia:是的,这就是 lambda 表达式的工作原理——但您不能将 lambda 参数的名称用作局部变量。它们是两种不同的东西。 lambda 表达式(就像匿名方法一样)的特点是它可以使用 局部变量。我认为您不了解 lambda 表达式参数的含义 - 它是一个 接收 值的变量(就像在常规方法中一样)。它不是您作为argument 传入的existing 局部变量的名称。已经捕获了局部变量,这就是无参数方法的工作原理。
    • 从表面上看,我想我还没有准备好认真使用 lambda 表达式,我会去研究更多,谢谢。
    • @sgarcia:我怀疑仔细阅读一本好书是个好主意,是的。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多