如果我有一个没有类型约束的函数参数:
> function a ($s=$null) {if ($s -eq $null) {Write-Host "HI"} if ($s -eq "") {Write-Host "KK"}}
> a
HI
现在,如果我向其添加类型约束,则$ null的解释方式不同:
> function a ([string]$s=$null) {if ($s -eq $null) {Write-Host "HI"} if ($s -eq "") {Write-Host "KK"}}
> a
KK
我找不到解释这个问题的文档。它也不一致。
答案 0 :(得分:2)
在您的第一个示例(函数a
)中,$s
相当于$null
- 它确实为空。
在你的第二个例子(函数b
)中,因为你将$s
转换为[string]
个对象,它实际上是一个空String
(相当于{{1} }}),不 [String]::Empty
。
您可以通过在每个功能中添加以下内容来检查:
$null
只有if($s -eq [String]::Empty){"empty!"};
会打印b
- empty!
会将此评估为a
或者,添加:
$false
$s|get-member
实际上会抛出错误 - 如果您运行a
,则会产生同样的错误。 $null|get-member
会告诉您b
是$s
并列出该类的所有成员。