什么是Func <T>上的Invoke属性?

Jam*_*Ide 4 c#

这会编译,但第二种方法被标记为"函数在所有路径上递归".并调用它会导致StackOverflowException.Intellisense(带有ReSharper)提供了Invoke作为属性.

public class Class1
{
    public void MyMethod(string value)
    {
        Console.WriteLine(value);
    }

    public void MyMethod(Func<string> getValue)
    {
        MyMethod(getValue.Invoke);
    }
}
Run Code Online (Sandbox Code Playgroud)

将其更改为此按预期工作:

    public void MyMethod(Func<string> getValue)
    {
        MyMethod(getValue.Invoke());
    }
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?这只是Intellisense的怪异还是实际上有一个Invoke属性?

Jon*_*eet 9

这是Invoke 方法 - 但是通过方法组转换进行转换...然后递归.看看这是否更清楚 - 它是等效的代码:

public void MyMethod(Func<string> getValue)
{
    Func<string> func = getValue.Invoke;
    MyMethod(func); // Eek, recursive!
}
Run Code Online (Sandbox Code Playgroud)

(我现在假设您熟悉方法组转换是获取委托实例的一种方式.如果您不是,请告诉我,我会详细介绍.)