Why is $false -eq “” true?

后端 未结 2 786
逝去的感伤
逝去的感伤 2020-12-03 17:44

The following code segments output true:

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

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

Since $false and \"\" ar

2条回答
  •  失恋的感觉
    2020-12-03 18:45

    When doing comparison operations, PowerShell will automatically attempt to coerce the object on the right-hand side of the operator to match the type on the left-hand side.

    In the case of coercing [string] to [bool], any non-null string will evaluate as $true, and a null string will evaluate as $false. See blog post Boolean Values and Operators for more information about automatic conversion of different data types to boolean values.

    This sometimes leads to unexpected results:

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

    The string value of $false is 'False', which is a non-null string and evaluated to $true when cast back to [bool].

    It also makes comparison operations non-commutative when the operands are of different data types:

    PS C:\> '' -eq $false
    False
    PS C:\> $false -eq ''
    True

    In the first comparison the value $false is auto-cast to a string in order to match the type of the first operand (''), so you're actually comparing '' -eq 'False', which evaluates to $false.

    In the second comparison the string '' is auto-cast to a boolean, again in order to match the type of the first operand ($false), so this time you're actually comparing $false -eq $false, which evaluates to $true.

提交回复
热议问题