Powershell ArrayList中的Null元素导致';无法将参数绑定到参数';错误 问题

Powershell ArrayList中的Null元素导致';无法将参数绑定到参数';错误 问题,powershell,arraylist,parameters,null,powershell-2.0,Powershell,Arraylist,Parameters,Null,Powershell 2.0,在下面的代码(PowerShell v2)中调用函数f$array时,我收到一个错误: f:无法将参数绑定到参数“csvObject1”,因为它为空 我的代码 问题: Powershell为什么要这样做?这对我来说是一个设计缺陷,但也许我没有看到大局 评论 我认为发生此错误是因为ArrayList中的第二行是$null。我对这一“发现”略感震惊,因为: 我花了大约4个小时才找到这个问题 这意味着在函数中使用强类型定义是一个坏主意,因为它会导致PowerShell检查数组中的每个元素,这是一个无法

在下面的代码(PowerShell v2)中调用函数
f$array
时,我收到一个错误:

f:无法将参数绑定到参数“csvObject1”,因为它为空

我的代码 问题: Powershell为什么要这样做?这对我来说是一个设计缺陷,但也许我没有看到大局

评论 我认为发生此错误是因为
ArrayList
中的第二行是
$null
。我对这一“发现”略感震惊,因为:

  • 我花了大约4个小时才找到这个问题
  • 这意味着在函数中使用强类型定义是一个坏主意,因为它会导致PowerShell检查数组中的每个元素,这是一个无法预料的开销
  • 如果我从函数定义中删除
    [System.Collections.ArrayList]
    ,问题就会消失

  • 不确定为什么PowerShell会生成异常,因为null是ArrayList的有效成员。但是,可以通过允许空值来强制参数验证

    像这样:

    [parameter(Position=0, Mandatory=$true)][AllowNull()][System.Collections.ArrayList] $array
    

    然后不会生成异常。

    您应该使用中所述的
    AllowNullAttribute


    这是一种防御性编程。PS在管道化时自动展开阵列和HASTABLE。全局考虑—当您将一堆服务器名称传递给其他服务器时,您不希望在其他服务器名称列表中出现空的服务器名称。

    谢谢。以上两个答案都很好。来自Java和.NET的背景,我花了一段时间才习惯这种“自动展开”。我真的不喜欢在返回值上使用神奇的逗号。我已经开始将参数传递到函数中,并使用PSObject上的属性从函数中返回值。它的开销稍大一些,但至少我得到了可预测的结果。
    [parameter(Position=0, Mandatory=$true)][AllowNull()][System.Collections.ArrayList] $array
    
    Param
    (
        [Parameter(Position=0, Mandatory=$true)]
        [AllowNull()]
        [System.Collections.ArrayList]$array
    )