【问题标题】:What is the purpose of "() =>" in lambda c#lambda c#中“()=>”的目的是什么
【发布时间】:2016-02-18 16:37:48
【问题描述】:

我一直在努力解决这个问题,这真的让我很烦恼。我有一些看起来像这样的代码

static T MyFunction<T>(Func<T> action, int i, int i2)
{
    ...some code here
}

当我需要调用此代码时,我尝试了这个

var result = MyFunction<List<string>>(MethodThatReturnsListofString(int number), 1,2)

它未能说明最佳重载具有无效参数 但是当我尝试以下

var result = MyFunction<List<string>>(() => MethodThatReturnsListofString(int number), 1,2)

它工作正常。在这种情况下,“()=>”的功能是什么。我认为()不能与需要超过 0 个参数的方法一起使用。

【问题讨论】:

  • MethodThatReturnsListofString(int number) 没有意义;您正在传递一个参数,而不是声明一个函数。请显示实际代码。
  • Func&lt;T&gt; action ...
  • 我很抱歉,我试图让我的问题更清楚,并且可能在尝试这样做时掩盖了问题。 MethodTheReturnsListOfString 采用单个整数参数。

标签: c# lambda delegates


【解决方案1】:

您正在传递一个不带参数的 lambda。
这是编写这样一个 lambda 的正确语法。

您的 lambda 恰好调用了一个带参数的函数这一事实完全无关紧要。

【讨论】:

  • 也许我对 Lambda 的基本理解是错误的。我正在拨打的电话的哪一部分被认为是 lambda?为了使我的问题更清楚,您说我正在传递一个不带参数的 lambda。我的“正确”调用的哪一部分是 lambda?
  • 是的;你是误解的事情。 lambda 由参数前缀 (() =&gt;) 和指定返回值的主体(在您的情况下为函数调用)组成。
  • 所以() =&gt; 只是一个实际不存在的方法的占位符,它不接受任何参数,并在我的情况下返回方法调用的结果MethodThatReturnsListOfString(int)??
  • @Rocky:这不是占位符;这是声明嵌套方法的语法。阅读文档。
  • 我实际上已经阅读了文档,只是发现它们有点令人困惑。感谢您帮助我更好地理解。因此() =&gt; 不会“保留”并放置,而是动态声明一个匿名方法,该方法将包含并返回在 lambda 表达式右侧调用的方法的结果,而不管参数的数量是多少第二种方法恰好调用。这是可行的,因为 lambda 没有实际参数,因此满足 Func&lt;T&gt; action 的要求。对吗?
【解决方案2】:

MyFunction&lt;T&gt; 期望第一个参数是一个不带参数并返回类型 T 的方法。

在您的第一次尝试中,您调用MethodThatReturnsListofString(number) 并尝试将结果(List&lt;T&gt;)作为参数而不是方法提供。

在您的第二次尝试中,您通过键入 () =&gt; MethodThatReturnsListofString(number) 创建具有所需签名的方法并将其作为参数提供。


为了更清楚,您可以创建一个类似的方法

static List<T> MyAnonymousMethod()
{
    return MethodThatReturnsListofString(number);
}

然后调用

MyFunction<List<string>>(MyAnonymousMethod, 1, 2);

使用() =&gt; MethodThatReturnsListofString,您声明了一个内联匿名方法,因此您无需先创建MyAnonymousMethod。这部分代码就是所谓的 lambda 表达式


注意,通过声明这个 lambda,MethodThatReturnsListofString 不会立即执行!只有当MyFunction真的像这样调用这个action参数时才会执行

static T MyFunction<T>(Func<T> action, int i, int i2)
{
    // ... some code
    var result = action();
    // ... more code
}

【讨论】:

  • 所以我正在创建一个不带参数的匿名方法来保存带数字的方法的结果?
  • @Rocky 确实如此。请注意,当MyFunction 实际调用此action 时,将使用number 的当前值。这可能已经与调用MyFunction时的值不同了
  • 啊。我可能可以通过小心我在调用 number 时如何操纵它的值来解释这一点。
【解决方案3】:

这仅仅意味着您正在调用一个接受 0 个参数的匿名方法。 如果它的 () => a+b

返回加法

否则,如果你提供一个主体

like ()=> { } 由你决定是否返回

另外,如果您提供需要它返回的委托,那么您必须返回。例如,Action 不需要,但 Func 需要

【讨论】:

    【解决方案4】:
    MethodThatReturnsListofString(number)
    

    不是Func&lt;T&gt;。它是一个Func&lt;T, U&gt;,其中List&lt;string&gt; 是一个类型参数,int 是另一个。此外,您正在提供此方法的 result - 而不是方法本身 - 作为函数的参数。

    另一方面,这个表达式是Func&lt;T&gt;

    () => MethodThatReturnsListofString(number)
    

    这是一个 lambda 表达式,它创建一个没有输入参数和一个输出参数的 delegateList&lt;string&gt;)。传递给MethodThatReturnsListofString()number 变量不是函数定义的一部分。该代码有效,因为number 变量是closure。该变量由编译器捕获并由方法使用,但它不是方法签名的一部分。

    我认为() 不能与需要超过 0 个参数的方法一起使用。

    没错。但请记住,此处用于 action 参数的 Func&lt;T&gt; 类型定义了一个接受 0 个参数并返回一个值的函数。因此,您正在做的是将您的表达式与MyFunctionaction 参数的Func&lt;T&gt; 类型匹配。仅仅因为您随后在新的 Func&lt;T&gt; 委托中调用需要参数的方法并不意味着委托本身需要参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2021-12-24
      相关资源
      最近更新 更多