繁体   English   中英

Lambda C#中“()=>”的目的是什么

[英]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个参数并返回一个值的函数。 因此,您正在做的就是将表达式与MyFunctionaction参数的Func<T>类型匹配。 仅仅因为您然后在新的Func<T>委托中调用了需要参数的方法,并不意味着委托本身就需要参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM