2014-09-24 19 views
7

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?

+2

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

+2

Jeśli zrobisz "(" -eq $ false "), wynikiem będzie fałsz. – Richard

+1

To prawda. Odpowiedź wyjaśnia dlaczego. – Matt

Odpowiedz

19

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.

+0

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. –

+0

Technicznie są to różne rzeczy, ale każda z nich oceni jako "$ false", gdy zostanie rzucona jako [bool]. – mjolinor

Powiązane problemy