函数< >的Invoke属性是什么?

本文关键字:属性 是什么 Invoke 函数 | 更新日期: 2023-09-27 18:09:11

这可以编译,但是第二个方法被标记为"Function is recursive on all paths."并且调用它会导致StackOverflowException。智能感知(w/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());
    }

这是怎么回事?这只是智能感知的奇怪之处,还是真的有一个调用属性?

函数< >的Invoke属性是什么?

这是Invoke 方法 -但通过方法组转换…这就是递归。看看这是否使它更清楚-它是等效的代码:

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

(我现在假设您熟悉方法组转换,将其作为获取委托实例的一种方式。

请告诉我,我将详细介绍。

为了补充Jon的答案,请注意,在对象浏览器中找不到Invoke成员的原因是,根据文档:

注意

公共语言运行库为每种语言提供了一个Invoke方法委托类型,具有与委托相同的签名。你不需要必须从c#, Visual Basic或Visual中显式调用此方法c++,因为编译器会自动调用它。Invoke方法为在反射中查找签名时非常有用委托类型。