为什么$ false -eq""是真的?

Bac*_*ave 10 powershell

以下代码段输出true:

$x = ($false -eq "") 
Write-Host $x

$x = ($false -eq 0) 
Write-Host $x
Run Code Online (Sandbox Code Playgroud)

由于$ false和""是不同的数据类型,它不应该自动等于false吗?

mjo*_*nor 24

进行比较操作时,PowerShell将自动尝试强制操作员右侧的对象以匹配左侧的类型.

在强制[string]转换的情况下[bool],任何非空字符串都将计算为$true,并且空字符串将计算为$false.有关将不同数据类型自动转换为布尔值的更多信息,请参阅博客文章布尔值和运算符.

这有时会导致意想不到的结果:

PS C:\> [bool]"$false" 

True
Run Code Online (Sandbox Code Playgroud)

字符串值为$false'False',这是一个非空字符串,并$true在转换为时进行求值[bool].

当操作数具有不同的数据类型时,它还使比较操作不可交换:

PS C:\> '' -eq $false
False
PS C:\> $false -eq ''
True
Run Code Online (Sandbox Code Playgroud)

在第一次比较中$false,为了匹配第一个操作数('')的类型,将值自动转换为字符串,因此您实际上正在进行比较'' -eq 'False',评估结果为$false.

在第二个比较中,字符串''被自动转换为布尔值,同样为了匹配第一个操作数($false)的类型,所以这次你实际上是比较$false -eq $false,评估为$true.