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

时间:2011-09-20 13:42:28

标签: 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);
    }
}

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

    public void MyMethod(Func<string> getValue)
    {
        MyMethod(getValue.Invoke());
    }

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

2 个答案:

答案 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方法是   当你想要找到的签名时,在反射中很有用   代表类型。