C# 函数的Invoke属性是什么<;T>;?

C# 函数的Invoke属性是什么<;T>;?,c#,C#,这可以编译,但第二个方法被标记为“函数在所有路径上都是递归的”。调用它会导致StackOverflowException。Intellisense(带ReSharper)作为属性提供了调用 public class Class1 { public void MyMethod(string value) { Console.WriteLine(value); } public void MyMethod(Func<string> get

这可以编译,但第二个方法被标记为“函数在所有路径上都是递归的”。调用它会导致StackOverflowException。Intellisense(带ReSharper)作为属性提供了调用

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

    public void MyMethod(Func<string> getValue)
    {
        MyMethod(getValue.Invoke);
    }
}
公共类1
{
公共void MyMethod(字符串值)
{
控制台写入线(值);
}
公共void MyMethod(Func getValue)
{
MyMethod(getValue.Invoke);
}
}
将其更改为此选项将按预期工作:

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

这是怎么回事?这仅仅是Intellisense的怪异,还是实际上存在调用属性?

它是
调用方法-但通过方法组转换进行转换。。。然后是递归的。看看这是否能让它更清晰-这是等效代码:

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

(我假设您熟悉方法组转换作为获取委托实例的一种方式。如果您不熟悉,请告诉我,我将详细介绍。)

要补充Jon的答案,请注意,在对象浏览器中找不到
Invoke
成员的原因是:

公共语言运行库为每个 委托类型,具有与委托相同的签名。你没有 必须从C#、Visual Basic或Visual Basic显式调用此方法 C++,因为编译器自动调用它。
Invoke
方法是 当您想要查找 委托类型


这个答案对我来说毫无意义。通过Intellisense和对象浏览器,
Invoke
方法在每个委托上都非常清晰可见。@如果您能在对象浏览器中提供委托类型的
Invoke
屏幕截图,mquander将非常棒,我似乎在我的浏览器中找不到它。好吧,对象浏览器有一些我不明白的地方。我明天会进一步调查。与此同时!我对方法组转换的熟悉程度仅限于,它意味着在将事件处理程序委托添加到事件中时不再需要新的事件处理程序委托。这是我唯一一次故意碰到它。Intellisense没有用方法签名提示,这令人失望。@Jamie:它不是像通常那样只填写名称吗?让它成为方法调用由您决定。ReSharper会自动添加方法调用,所以我想我不应该对Intellisense太苛刻。但这很让人困惑,因为通常情况下,你不能有一个方法和一个具有相同签名的属性。@Jamie:事实上,你不能-
Invoke
不是一个属性。这里不寻常的情况是,方法组转换和方法调用都是有效的。