[英]What is the purpose of “() =>” in lambda c#
我一直试图弄清楚这一点,这确实使我烦恼。 我有一些看起来像这样的代码
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个args的方法一起使用。
您正在传递不带任何参数的lambda。
这是编写这样的lambda的正确语法。
您的lambda恰巧调用了一个带有参数的函数这一事实是完全不相关的。
MyFunction<T>
期望将不带任何参数并返回类型T
的方法作为第一个参数。
在您的第一次尝试中,您调用MethodThatReturnsListofString(number)
并尝试提供结果( List<T>
)作为参数而不是方法。
在第二次尝试中,通过键入() => MethodThatReturnsListofString(number)
创建具有所需签名的() => 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
它返回加法
否则,如果您提供它的身体
喜欢()=> {},取决于您是否返回
另外,如果您提供需要返回的委托,则必须返回。 例如,不需要动作,但功能需要
MethodThatReturnsListofString(number)
不是Func<T>
。 它是一个Func<T, U>
,其中List<string>
是一个类型参数,而int
是另一个类型参数。 而且,您将提供此方法的结果(而不是方法本身)作为函数的参数。
另一方面,此表达式是Func<T>
:
() => MethodThatReturnsListofString(number)
这是一个lambda表达式,它创建一个没有输入参数和一个输出参数( List<string>
)的委托 。 传递给MethodThatReturnsListofString()
的number
变量不属于函数定义。 该代码有效,因为number
变量是一个闭包 。 该变量由编译器捕获并由方法使用,但它不是方法签名的一部分。
我以为
()
不能用于需要超过0个args的方法。
那是对的。 但是请记住,此处用于action
参数的Func<T>
类型定义了一个接受0个参数并返回一个值的函数。 因此,您正在做的就是将表达式与MyFunction
的action
参数的Func<T>
类型匹配。 仅仅因为您然后在新的Func<T>
委托中调用了需要参数的方法,并不意味着委托本身就需要参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.