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

本文关键字:是什么 lambda | 更新日期: 2023-09-27 18:35:11

我一直在试图解决这个问题,这真的困扰着我。我有一些看起来像这样的代码

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个参数的方法一起使用。

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

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

事实上,你的lambda碰巧调用了一个接受参数的函数,这是完全无关紧要的。

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
}

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

它返回加法

否则,如果您为其提供身体

喜欢 ()=> { } 是否返回

取决于您

此外,如果您提供需要它返回的委托,那么您必须返回。 例如,操作不需要,但 Func 确实需要

MethodThatReturnsListofString(number)

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

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

() => MethodThatReturnsListofString(number)

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

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

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