“()=>”的目的是什么?在lambda c#

时间:2016-02-18 16:37:48

标签: c# lambda delegates

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

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)

工作正常。 “()=&gt;”的功能是什么?在这种情况下。我认为()不能用于需要超过0 args的方法。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

MyFunction<T>期望第一个参数是一个不带参数的方法,并返回类型T

在您第一次尝试时,请致电MethodThatReturnsListofString(number)并尝试提供结果(List<T>)作为参数而不是方法。

在第二次尝试中,您可以通过键入() => MethodThatReturnsListofString(number)创建一个包含所需签名的方法,并将其作为参数提供。

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

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

然后调用

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

使用() => MethodThatReturnsListofString声明匿名方法内嵌,因此您无需先创建MyAnonymousMethod。这段代码就是所谓的 lambda表达式

注意通过声明此lambda,MethodThatReturnsListofString不会立即执行!它仅在MyFunction真正调用此动作参数(如

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

答案 2 :(得分:3)

这只是意味着您正在调用一个接受0参数的匿名方法。 如果它的()=&gt; A + B

它返回添加

否则,如果你提供身体

like()=&gt; {}它取决于你返回

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

答案 3 :(得分:1)

MethodThatReturnsListofString(number)

不是Func<T>。它是Func<T, U>,其中List<string>是一种类型参数,int是另一种。此外,您提供此方法的结果 - 而不是方法本身 - 作为函数的参数。

另一方面,这个表达式是Func<T>

() => MethodThatReturnsListofString(number)

这是一个lambda表达式,它创建一个委托,没有输入参数和一个输出参数(List<string>)。传递给number的{​​{1}}变量是不是功能定义的一部分。该代码有效,因为MethodThatReturnsListofString()变量是closure。该变量由编译器捕获并由方法使用,但它不是方法签名的一部分。

  

我认为number不能用于需要超过0 args的方法。

这是正确的。但请记住,此处用于()参数的Func<T>类型定义了一个接受0参数并返回一个值的函数。因此,您所做的是将表达式与action Func<T> MyFunction参数的action类型相匹配。仅仅因为你在新的Func<T>委托中调用一个需要参数的方法并不代表委托本身需要一个参数。