我一直试图解决这个问题,这真的让我烦恼。我有一些看起来像这样的代码
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)
工作正常。 “()=&gt;”的功能是什么?在这种情况下。我认为()不能用于需要超过0 args的方法。
答案 0 :(得分:5)
你传递的是一个不带参数的lambda 这是编写这样一个lambda的正确语法。
你的lambda恰好调用一个带参数的函数这一事实完全无关紧要。
答案 1 :(得分:4)
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
}
答案 2 :(得分:3)
这只是意味着您正在调用一个接受0参数的匿名方法。 如果它的()=&gt; A + B
它返回添加
否则,如果你提供身体
like()=&gt; {}它取决于你返回
如果您提供需要它返回的委托,那么您必须返回。例如,行动不需要,但Func需要
答案 3 :(得分:1)
MethodThatReturnsListofString(number)
不是Func<T>
。它是Func<T, U>
,其中List<string>
是一种类型参数,int
是另一种。此外,您提供此方法的结果 - 而不是方法本身 - 作为函数的参数。
另一方面,这个表达式是Func<T>
:
() => MethodThatReturnsListofString(number)
这是一个lambda表达式,它创建一个委托,没有输入参数和一个输出参数(List<string>
)。传递给number
的{{1}}变量是不是功能定义的一部分。该代码有效,因为MethodThatReturnsListofString()
变量是closure。该变量由编译器捕获并由方法使用,但它不是方法签名的一部分。
我认为
number
不能用于需要超过0 args的方法。
这是正确的。但请记住,此处用于()
参数的Func<T>
类型定义了一个接受0参数并返回一个值的函数。因此,您所做的是将表达式与action
Func<T>
MyFunction
参数的action
类型相匹配。仅仅因为你在新的Func<T>
委托中调用一个需要参数的方法并不代表委托本身需要一个参数。