为什么将$ null传递给带有AllowNull()的参数会导致错误?

alx*_*x9r 1 parameters powershell nullable

请考虑以下代码:

function Test
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory=$true)]
        [AllowNull()]
        [String]
        $ComputerName
    ) 
    process{}
}

Test -ComputerName $null
Run Code Online (Sandbox Code Playgroud)

基于官方文档AllowNull我期待的$ComputerName可能是[string]$null.但是,运行上面的代码会导致以下错误:

[14,24:Test]无法将参数绑定到参数'ComputerName',因为它是一个空字符串.

为什么$ComputerName在这种情况下不传递$ null用于工作?

use*_*407 7

$null,当转换为[string]时,不返回空字符串$null:

[string]$null -eq $null # False
[string]$null -eq [string]::Empty # True
Run Code Online (Sandbox Code Playgroud)

如果你想传递$null[string]参数,你应该使用[NullString]::Value:

[string][NullString]::Value -eq $null # True
Test -ComputerName ([NullString]::Value)
Run Code Online (Sandbox Code Playgroud)