2014-09-24 21 views
7

Sau đây đầu ra đoạn mã đúng:

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

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

Từ $ false và "" nhiều loại dữ liệu khác nhau, không nên nó tự động bằng sai?

+2

Trong chuỗi dài PowerShell 0 được đánh giá là sai. [This] (http://blogs.msdn.com/b/powershell/archive/2006/12/24/boolean-values-and-operators.aspx) đề cập đến nó nhưng tôi đang tìm kiếm một thứ khác. – Matt

+2

Nếu bạn làm '(" "-eq $ false)' kết quả là sai. – Richard

+1

Đúng vậy. Câu trả lời giải thích tại sao. – Matt

Trả lời

19

Khi thực hiện các hoạt động so sánh, PowerShell sẽ tự động cố gắng ép buộc đối tượng ở phía bên tay phải của toán tử để khớp với loại ở phía bên tay trái.

Trong trường hợp co giật [string] đến [bool], bất kỳ chuỗi không null nào sẽ đánh giá là $true và chuỗi rỗng sẽ đánh giá là $false. Xem bài đăng trên blog Boolean Values and Operators để biết thêm thông tin về tự động chuyển đổi các loại dữ liệu khác nhau thành giá trị boolean.

Điều này đôi khi dẫn đến kết quả bất ngờ:

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

True 

Các chuỗi giá trị của $false là 'False', mà là một chuỗi không null và đánh giá để $true khi đúc lại [bool].

Nó cũng làm cho hoạt động so sánh phi giao hoán khi các toán hạng là các loại dữ liệu khác nhau:

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

Trong sự so sánh đầu tiên giá trị $false là auto-cast thành một chuỗi theo thứ tự để phù hợp với kiểu của toán hạng đầu tiên (''), vì vậy bạn thực sự so sánh '' -eq 'False', đánh giá là $false.

Trong sự so sánh thứ hai chuỗi '' là auto-cast vào một boolean, một lần nữa để phù hợp với loại toán hạng đầu tiên ($false), vì vậy thời gian này bạn đang thực sự so sánh $false -eq $false, mà đánh giá để $true.

+0

cảm ơn câu trả lời. Nhưng khi bạn nói "null string" bạn có nghĩa là chuỗi rỗng, phải không? Bởi vì một chuỗi rỗng và một chuỗi rỗng là hai thứ khác nhau. –

+0

Về mặt kỹ thuật chúng là những thứ khác nhau, nhưng một trong hai giá trị này sẽ được đánh giá là $ false khi truyền dưới dạng [bool]. – mjolinor

Các vấn đề liên quan