为什么在使用 ByRef 时要为变量赋值“.Value”?

Why variables should be assigned with ".Value" when using ByRef?

有什么区别:

$A="Something"

$A.Value="Something"

我看到这仅在使用 .Value 时有效:

function main
{
    $A="Original A"
    $B="Original B"

    SetByRef1 ([ref]$A)
    SetByRef2 ([ref]$B)

    $A
    $B

    #output: Changed A
    #output: Original B
}


function SetByRef1([ref]$A)
{
    $A.Value = "Changed A"
}

function SetByRef2([ref]$B)
{
    $B = "Changed B"
}

main

我猜,$B = "Changed B" 定义了一个新的变量 B,而 $A.Value = "Changed A" 只是改变了内容,但我还没有找到证实。

在函数中使用引用变量时,必须使用 .Value 与原始对象交互,如 About_Ref

中所示
PS C:\ps-test> function double
>> {
>>     param ([ref]$x) $x.value = $x.value * 2
>> }

如果您在函数内部检查对象,您可以看出不同之处。在函数 SetByRef1 中,我添加了以下行。

$a.GetType().FullName
$a.value.GetType().FullName

得到以下输出。

System.Management.Automation.PSReference`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
System.String

$a.value的类型说明你是在对原始对象进行操作。