PowerShell:为什么真相包含谎言?

Tes*_*ler 5 powershell

PS C:\> $true -contains "Lies"
True
Run Code Online (Sandbox Code Playgroud)

...?

help about_operators

比较运算符包括包含运算符(in,-notin,-contains,-notcontains),它们确定测试值是否出现在引用集中.

$true它不是一个容器类型,它怎么可能是一个"参考集"并且包含......什么都没有?它不包含虚假的东西.


同样$null -in $null是真的

zda*_*dan 8

$true 转换为1个元素的集合,因此它相当于:

# ~> @($true) -contains "Lies"
True
Run Code Online (Sandbox Code Playgroud)

因此集合中的每个元素都与"Lies"进行比较:

# ~> $true -eq "Lies"
True
Run Code Online (Sandbox Code Playgroud)

所以真正的问题是,为什么上面的表达式评估为真.发生的事情是它正在转换oepration的右侧以匹配左侧的类型:

# ~> $true -eq [Bool]"Lies"
True
Run Code Online (Sandbox Code Playgroud)

因为:

# ~> [Bool]"Lies"
True
Run Code Online (Sandbox Code Playgroud)

所以如果你交换操作:

# ~> "Lies" -eq $true
False
Run Code Online (Sandbox Code Playgroud)

因为:

# ~> [String]$true
True
Run Code Online (Sandbox Code Playgroud)

同样地,$null -in $null是一样的$null -in @($null),并$null -eq $null是真实的.