这会编译,但第二种方法被标记为"函数在所有路径上递归".并调用它会导致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属性?
这是Invoke 方法 - 但是通过方法组转换进行转换...然后递归.看看这是否更清楚 - 它是等效的代码:
public void MyMethod(Func<string> getValue)
{
Func<string> func = getValue.Invoke;
MyMethod(func); // Eek, recursive!
}
Run Code Online (Sandbox Code Playgroud)
(我现在假设您熟悉方法组转换是获取委托实例的一种方式.如果您不是,请告诉我,我会详细介绍.)
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |