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

“的目的是什么?”;()=>&引用;在lambda c#,c#,lambda,delegates,C#,Lambda,Delegates,我一直想弄明白这一点,这真的让我很烦恼。我有一些代码看起来像这样 static T MyFunction<T>(Func<T> action, int i, int i2) { ...some code here } static T MyFunction(Func动作,int i,int i2) { …这里有一些代码 } 当我需要调用这个代码时,我尝试了这个 var result = MyFunction<List<string>>(

我一直想弄明白这一点,这真的让我很烦恼。我有一些代码看起来像这样

static T MyFunction<T>(Func<T> action, int i, int i2)
{
    ...some code here
}
static T MyFunction(Func动作,int i,int i2)
{
…这里有一些代码
}
当我需要调用这个代码时,我尝试了这个

var result = MyFunction<List<string>>(MethodThatReturnsListofString(int number), 1,2)
var result=MyFunction(返回slistofstring(整数)的方法,1,2)
它无法声明最佳重载具有无效参数 但当我尝试以下方法时

var result = MyFunction<List<string>>(() => MethodThatReturnsListofString(int number), 1,2)
var result=MyFunction(()=>MethodThatReturnsSlistofString(整数),1,2)

它很好用。在这种情况下,“()=>”的功能是什么。我认为()不能与需要超过0个参数的方法一起使用

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


lambda恰好调用了一个带参数的函数这一事实与此完全无关。

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


事实上,lambda恰好调用了一个接受参数的函数,这与此完全无关。

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

它返回加法

否则,如果你给它提供一个身体

like()=>{}返回与否取决于您


此外,如果您提供了需要返回的委托,则必须返回。对于eg Action不需要,但是Func确实需要

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

它返回加法

否则,如果你给它提供一个身体

like()=>{}返回与否取决于您

此外,如果您提供了需要返回的委托,则必须返回。例如,Action不需要,但Func do require

MyFunction
需要一个不带参数并返回类型
T
的方法作为第一个参数


在第一次尝试中,调用返回slistofString(number)的
方法,并尝试将结果(一个
列表
)作为参数而不是方法提供

在第二次尝试中,通过键入返回slistofString(number)
()=>方法,创建具有所需签名的方法,并将其作为参数提供


为了更清楚地说明这一点,您可以创建如下方法

static List<T> MyAnonymousMethod()
{
    return MethodThatReturnsListofString(number);
}
MyFunction
需要一个不带任何参数并返回类型
T
的方法作为第一个参数


在第一次尝试中,调用返回slistofString(number)
方法,并尝试将结果(一个
列表
)作为参数而不是方法提供

在第二次尝试中,通过键入返回slistofString(number)
()=>方法,创建具有所需签名的方法,并将其作为参数提供


为了更清楚地说明这一点,您可以创建如下方法

static List<T> MyAnonymousMethod()
{
    return MethodThatReturnsListofString(number);
}
不是
Func
。它是一个
Func
,其中
List
是一个类型参数,
int
是另一个类型参数。此外,您将提供此方法的结果(而不是方法本身)作为函数的参数

另一方面,此表达式是一个
Func


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

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

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

不是
Func
。它是一个
Func
,其中
List
是一个类型参数,
int
是另一个类型参数。此外,您将提供此方法的结果(而不是方法本身)作为函数的参数

另一方面,此表达式是一个
Func


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

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


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

methodthattreturnslistofstring(int number)
没有意义;您正在传递一个参数,而不是声明一个函数。请显示实际代码。
Func操作
…我的
static T MyFunction<T>(Func<T> action, int i, int i2)
{
    // ... some code
    var result = action();
    // ... more code
}
MethodThatReturnsListofString(number)
() => MethodThatReturnsListofString(number)