Следующий сегменты кода вывода верно:
$x = ($false -eq "")
Write-Host $x
$x = ($false -eq 0)
Write-Host $x
С $ ложны и «» различные типы данных, не должны автоматически равно ложь?
Следующий сегменты кода вывода верно:
$x = ($false -eq "")
Write-Host $x
$x = ($false -eq 0)
Write-Host $x
С $ ложны и «» различные типы данных, не должны автоматически равно ложь?
При выполнении операций сравнения 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
.
спасибо за ответ. Но когда вы говорите «пустая строка», вы подразумеваете пустую строку, верно? Потому что пустая строка и пустая строка - это две разные вещи. –
Технически это разные вещи, но каждый из них будет оценивать значение $ false при использовании в качестве [bool]. – mjolinor
В PowerShell длина строки длины оценивается как ложная. [Это] (http://blogs.msdn.com/b/powershell/archive/2006/12/24/boolean-values-and-operators.aspx) упоминает об этом, но я искал что-то еще. – Matt
Если вы делаете '(" "-eq $ false), результат будет ложным. – Richard
Это правильно. Ответ объясняет, почему. – Matt