【问题标题】:Setting an array variable that is passed by reference设置通过引用传递的数组变量
【发布时间】:2016-09-06 16:00:05
【问题描述】:

我在函数中有一个数组对象变量[ref] $InsertColHeadName = @(),然后用param ([ref] $InsertColHeadName) 调用另一个函数。在被调用的函数中,我尝试引用参数([ref] $InsertColHeadName) += expression 中的参数集。表达式返回一个字符串。我在该行中放置了一个断点并尝试用单引号强制一个字符串,例如:([ref] $InsertColHeadName) += 'xyz';

我尝试谷歌搜索,但似乎找不到合适的解决方案。

我收到以下错误:

方法调用失败,因为 [System.Management.Automation.PSReference`1
[[System.Management.Automation.PSReference`1
[[System.Management.Automation.PSReference`1
[[System.Object[],mscorlib,版本=4.0.0.0,文化=中性,
PublicKeyToken=b77a5c561934e089]],System.Management.Automation,版本=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35]],System.Management.Automation,
版本=3.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35]]] 不
包含一个名为“op_Addition”的方法。
在行:1 字符:1
+ ([ref] $InsertColHeadName) += 'DepartmentNo';
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

【问题讨论】:

  • 你为什么首先使用[ref]$arr = @()而不是$arr = @()
  • 在我在 main 函数中使用它之前,它不需要引用。由于主函数多次使用特定逻辑,这与具有一些验证逻辑的逻辑相同,我认为将其推送到函数并调用该函数会更好。我试图引用的变量在另一个可能需要该变量可用的函数调用中使用。

标签: powershell


【解决方案1】:

在函数内部,InsertColHeadName 已经是一个引用。将 [ref] 添加到它会创建引用的引用。

改为尝试:

$InsertColHeadName.Value += expression

这是一个例子:

function AddMe([ref]$array)
{
    $array.value += 40
}

$x = @(1..10)

Write-Host Before Calling AddMe $x
AddMe ([ref]$x)
Write-Host After Calling AddMe $x

输出:

Before Calling AddMe 1 2 3 4 5 6 7 8 9 10
After Calling AddMe 1 2 3 4 5 6 7 8 9 10 40

【讨论】:

    【解决方案2】:

    仍然对如何将数组设置为 $InsertColHeadName = @() 感到困惑,但通过以下方式解决了它。

    在主函数中,我将数组创建为Array = New-Object System.Collections.Generic.List[System.Object]。调用函数时,我将参数传递为([ref] $InsertColHeadName)

    在 param 的调用函数中,我将参数设置为 [ref] $InsColHeadName 作为新名称,以免将其与主函数混淆以使维护更容易,然后通过执行 @987654325 将值添加到数组中@。

    当返回主函数时,上面的引用传递工作。

    【讨论】:

      【解决方案3】:

      有同样的问题。只需确保不要多次将对象投射到 [ref] 即可。这就像投射 [ref][ref][ref]$YourObject。

      【讨论】:

        【解决方案4】:

        当使用带参数的 [ref] 时,我们必须通过 $parameter.Value 引用传递的参数,而不仅仅是 $parameter

        function Foo-Bar {
            param (
                [ref]$array
            )
            Write-Host $array
        
            $array.Value += { Title="a" }
            
        }
        
        $externalArray = New-Object System.Collections.Generic.List[System.Object]
        $externalArray += { Title="initial" }
        
        Foo-Bar -a ([ref]$externalArray)
        
        
        • 作品$array.Value += { Title="a" }
        • 不起作用:$array+= { Title="a" }

        【讨论】:

          猜你喜欢
          • 2011-10-03
          • 1970-01-01
          • 2017-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-02
          • 2017-03-27
          相关资源
          最近更新 更多