Why does passing $null to a parameter with AllowNull() result in an error?

只谈情不闲聊 提交于 2019-12-29 09:27:07

问题


Consider the following code:

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

Test -ComputerName $null

Based on the official documentation for AllowNull I was expecting that $ComputerName could either be [string] or $null. However, running the above code results in the following error:

[14,24: Test] Cannot bind argument to parameter 'ComputerName' because it is an empty string.

Why doesn't passing $null for $ComputerName work in this case?


回答1:


$null, when converted to [string], return empty string not $null:

[string]$null -eq $null # False
[string]$null -eq [string]::Empty # True

If you want to pass $null for [string] parameter you should use [NullString]::Value:

[string][NullString]::Value -eq $null # True
Test -ComputerName ([NullString]::Value)



回答2:


You also need to add the [AllowEmptyString()] attribute if you plan on allowing nulls and empty strings.

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

Test -ComputerName $null


来源:https://stackoverflow.com/questions/31843443/why-does-passing-null-to-a-parameter-with-allownull-result-in-an-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!