这会编译,但第二种方法被标记为“函数在所有路径上都是递归的”。并调用它会导致StackOverflowException。 Intellisense(带有ReSharper)提供了Invoke作为属性。
public class Class1
{
public void MyMethod(string value)
{
Console.WriteLine(value);
}
public void MyMethod(Func<string> getValue)
{
MyMethod(getValue.Invoke);
}
}
将其更改为此按预期工作:
public void MyMethod(Func<string> getValue)
{
MyMethod(getValue.Invoke());
}
这里发生了什么?这只是Intellisense的怪异还是实际上有一个Invoke属性?
答案 0 :(得分:9)
这是Invoke
方法 - 但是通过方法组转换进行转换...然后递归。看看这是否更清楚 - 它是等效的代码:
public void MyMethod(Func<string> getValue)
{
Func<string> func = getValue.Invoke;
MyMethod(func); // Eek, recursive!
}
(我现在假设您熟悉方法组转换是获取委托实例的一种方式。如果您不是,请告诉我,我会详细介绍。)
答案 1 :(得分:-2)
要添加到Jon的答案,请注意,在对象浏览器中找不到Invoke
成员的原因是因为,the docs:
注意
公共语言运行时为每个提供
Invoke
方法 委托类型,与委托具有相同的签名。你不 必须从C#,Visual Basic或Visual中显式调用此方法 C ++,因为编译器会自动调用它。Invoke
方法是 当你想要找到的签名时,在反射中很有用 代表类型。