2014-09-24 5 views
7

Следующий сегменты кода вывода верно:

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

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

С $ ложны и «» различные типы данных, не должны автоматически равно ложь?

+2

В PowerShell длина строки длины оценивается как ложная. [Это] (http://blogs.msdn.com/b/powershell/archive/2006/12/24/boolean-values-and-operators.aspx) упоминает об этом, но я искал что-то еще. – Matt

+2

Если вы делаете '(" "-eq $ false), результат будет ложным. – Richard

+1

Это правильно. Ответ объясняет, почему. – Matt

ответ

19

При выполнении операций сравнения PowerShell автоматически попытается принудить объект в правой части оператора к типу с левой стороны.

В случае принуждая [string] к [bool], любая непустая строка будет распознана как $true, и пустая строка будет определена как $false. См. Сообщение в блоге Boolean Values and Operators для получения дополнительной информации об автоматическом преобразовании разных типов данных в булевские значения.

Это иногда приводит к неожиданным результатам:

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

True 

Строковое значение $false является «False», который не является пустой строкой и оценивается в $true когда отбрасывать назад [bool].

Это также делает операции сравнения некоммутативными когда операнды имеют разные типов данных:

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

В первом сравнении значение $false является автоматическим приведением к строке для того, чтобы соответствовать типу конструкции первый операнд (''), так что вы на самом деле сравниваете '' -eq 'False', что составляет $false.

Во втором сравнении строка '' является автоматическим приведением к булеву, опять-таки для того, чтобы соответствовать типу первого операнда ($false), поэтому на этот раз вы на самом деле сравнение $false -eq $false, который вычисляет $true.

+0

спасибо за ответ. Но когда вы говорите «пустая строка», вы подразумеваете пустую строку, верно? Потому что пустая строка и пустая строка - это две разные вещи. –

+0

Технически это разные вещи, но каждый из них будет оценивать значение $ false при использовании в качестве [bool]. – mjolinor

Смежные вопросы