c# – PowerShell:将块作为参数传递给函数

我将以一个例子来解释我的问题.我们在C#中有以下代码
void A(Action block)
{
 B(() =>
 {
  Console.WriteLine(2);
  block();
 });
}

void B(Action block)
{
 Console.WriteLine(1);
 block();
}

void Main()
{
 A(() =>
 {
  Console.WriteLine(3);
 });
}

代码输出是:

1
2
3

现在,我想在PowerShell中编写这个代码

function A($block) {
    B {
        2
        . $block
    }
}

function B($block) {
    1
    . $block
}

A {
    3
}

但是,此代码会导致调用深度溢出:

The script Failed due to call depth
overflow. The call depth reached 1001
and the maximum is 1000.

我发现如果我更改函数B的参数的名称,它将工作.

这是一个功能还是一个错误(或两者兼有)?如何在PowerShell中进行这项工作,而不必在功能之间拥有独特的参数?

解决方法

是的,你将递归,因为传递到函数B中的脚本块中的$block引用在函数B的上下文中进行求值,结果计算为B的$block参数的值.

如果您不想更改参数名称(不要怪你),可以强制PowerShell在A中创建一个新的闭包,以捕获函数A中$block的值,例如:

function A($block) 
{    
     B {Write-Host 2; &$block}.GetNewClosure()
}

function B($block) 
{
    Write-Host 1
    &$block
}

A {Write-Host 3}

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...