函数< >的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
方法 -但通过方法组转换…这就是递归。看看这是否使它更清楚-它是等效的代码:
public void MyMethod(Func<string> getValue)
{
Func<string> func = getValue.Invoke;
MyMethod(func); // Eek, recursive!
}
(我现在假设您熟悉方法组转换,将其作为获取委托实例的一种方式。
为了补充Jon的答案,请注意,在对象浏览器中找不到Invoke
成员的原因是,根据文档:
注意
公共语言运行库为每种语言提供了一个
Invoke
方法委托类型,具有与委托相同的签名。你不需要必须从c#, Visual Basic或Visual中显式调用此方法c++,因为编译器会自动调用它。Invoke
方法为在反射中查找签名时非常有用委托类型。