“的目的是什么?”;()=>&引用;在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)