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。
这是编写此类 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 个参数并返回一个值的函数。所以你正在做的是将你的表达式与MyFunction
的action
参数的Func<T>
类型相匹配。仅仅因为您随后调用了一个需要在新的Func<T>
委托中提供参数的方法,并不意味着委托本身需要一个参数。