Poniższe fragmenty kodu wyjście prawda:
$x = ($false -eq "")
Write-Host $x
$x = ($false -eq 0)
Write-Host $x
Od $ fałszywy i „” są różne typy danych, nie powinien automatycznie równa fałsz?
Poniższe fragmenty kodu wyjście prawda:
$x = ($false -eq "")
Write-Host $x
$x = ($false -eq 0)
Write-Host $x
Od $ fałszywy i „” są różne typy danych, nie powinien automatycznie równa fałsz?
Podczas wykonywania operacji porównania, PowerShell automatycznie spróbuje wymusić na obiekcie obiekt po prawej stronie, aby dopasować go do typu po lewej stronie.
W przypadku wymuszenia [string]
do [bool]
każdy niezerowe ciąg oceni jako $true
i łańcuchem pustym oceni jako $false
. Więcej informacji na temat automatycznej konwersji różnych typów danych na wartości logiczne można znaleźć na blogu: Boolean Values and Operators.
To czasami prowadzi do nieoczekiwanych wyników:
PS C:\> [bool]"$false"
True
Wartość ciąg $false
jest „false”, który jest niezerowe ciąg i oceniane do $true
kiedy rzucić z powrotem do [bool]
.
również sprawia, że operacje porównania nie przemienne gdy argumenty są różnych typów danych:
PS C:\>'' -eq $false
False
PS C:\>$false -eq ''
True
W pierwszym porównania wartość $false
jest auto-cast do łańcucha w celu dopasowania rodzaju pierwszy operand (''
), więc faktycznie porównujesz '' -eq 'False'
, który jest oceniany jako $false
.
W drugiej porównaniu ciąg ''
jest auto-cast do wartości logicznej, ponownie w celu dopasowania typu pierwszego argumentu ($false
), więc tym razem jesteś rzeczywiście porównując $false -eq $false
, które ocenia się $true
.
dzięki za odpowiedź. Ale kiedy mówisz "pusty łańcuch", masz na myśli pusty ciąg znaków, prawda? Ponieważ pusty łańcuch i pusty ciąg to dwie różne rzeczy. –
Technicznie są to różne rzeczy, ale każda z nich oceni jako "$ false", gdy zostanie rzucona jako [bool]. – mjolinor
W PowerShell 0 łańcuch długości jest oceniany jako fałszywy. [This] (http://blogs.msdn.com/b/powershell/archive/2006/12/24/boolean-values-and-operators.aspx) wspomina o tym, ale szukam czegoś innego. – Matt
Jeśli zrobisz "(" -eq $ false "), wynikiem będzie fałsz. – Richard
To prawda. Odpowiedź wyjaśnia dlaczego. – Matt