2016-05-20 2 views
3

Я не совсем уверен, является ли этот точный вопрос дубликат, но я не мог найти свой конкретный вопрос о stackoverflow, так что, я думаю, это не так.

$true является логическим типом:

($true).getType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Boolean         System.ValueType 

'true' является строкой:

('true').gettype() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 

почему это условие верно?

PS C:\WINDOWS\system32> if ('True' -eq $true) {'yes'} else {'no'} 
yes 

только потому, что строка называется True так же, как логическая истина? Если сравнивать его с любой другой строкой, есть другой результат:

PS C:\WINDOWS\system32> 'hello' -eq $true 
False 
PS C:\WINDOWS\system32> 'true' -eq $true 
True 

если вы 'true' == true в C# он печатает cannot convert string to bool ошибку и как C# и PS основаны на .net и имеют достаточно один и тот же синтаксис. почему есть другой результат? Мне это кажется очень странным.

Как оценивается PowerShell 'true' по $true?

+0

@ Matt не совсем.все они ссылаются на то, что это $ true -eq 'string' = true, поэтому мой вопрос - это точная строка «true» -eq $ true, а любая другая «string» -eq $ true - false. Я также видел те вопросы, которые вы указали, но они не то же самое. – SimonS

+1

Я удалил его, так как это не идеальный обман. Однако все ответы говорят о аргументах LHS и RHS и о том, что они применяются. Вы имеете в виду конкретный случай, поэтому он отлично работает. Если вы прочтете другие вопросы, которые могут быть связаны, вы должны связать их здесь и попытаться объяснить, что они не ответили на ваш вопрос. – Matt

+0

@Matt Я полностью согласен. ответ тот же. может быть, я был просто шокирован тем, что PowerShell оценивает такие вещи, чтобы я не читал ответы достаточно внимательно ;-). Тем не менее, для тех, кто ищет ответ на вопрос «почему это« истина »-eq $ true, этот вопрос дает прекрасное объяснение сейчас. – SimonS

ответ

4

В PowerShell перегрузка оператора определяется левым (lhs) аргументом.

Это означает, что когда вы передаете строку в качестве аргумента lhs, синтаксический анализатор попытается преобразовать правую часть (rhs) в строку.

При нажатии на строку $true выводится как строка «True», которая, поскольку операторы сравнения строк PowerShell по умолчанию нечувствительны к регистру, оказывается равным «true».

Эта операция:

'true' -eq $true 

интерпретируется как

'true' -eq 'True' 

Что случается $true, удовлетворяя ваше if состояние.


С $true, это также происходит работать наоборот, потому что непустая строка, когда преобразуется в логическое значение, имеет значение $true:

Другими словами

$true -eq 'true' 

Рассмотрен как

$true -eq $true 

Это может быть объявления к путанице, так как строка «ложь» будет кстати также быть оценена как $true, просто потому, что строка «ложь» не является пустой:

PS C:\> $true -eq "true" 
True 
PS C:\> $true -eq "false" 
True 
PS C:\> $true -eq "" 
False 
+0

'true -eq 'true'' также верно. поэтому Powershell также может преобразовать строку в логическое, если это то же значение, что и логическое? – SimonS

+0

Корректно - непустые строки оцениваются в '$ true', пустые строки до' $ false' –

+0

Сначала это может показаться немного интуитивным, но как только вы * знаете *, что оператор всегда определяется ** lhs ** типа, вы можете легко предсказать поведение, так что да, я бы сказал, довольно приятно :) –

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