PowerShell等式运算符不是对称关系?

时间:2012-04-17 05:55:57

标签: powershell

有人可以向我解释为什么PowerShell中的相等运算符不是对称关系吗?

PS> "" -eq 0
False
PS> 0 -eq ""
True

4 个答案:

答案 0 :(得分:10)

是的,PowerShell中的-eq不是等价关系。虽然理论家们此时可能会恐怖地哭泣,但主要是为了使语言更好地传达思想和更容易理解。

例如,PowerShell 总是尝试将二元运算符中的不同类型转换为 left 操作数的类型,这就是您在问题中看到行为的原因。在实践中,我发现这很少是一个问题,除了人为的例子。在我自己的数据中,我通常会使用匹配类型进行比较,在处理其他数据时,转换通常无害,因为它们会破坏其含义。在这种情况下,我认为语言的可预测性比获得数学理想更重要(考虑到计算机中的数字只是数学实体的近似值,这在任何地方都无法实现)。 / p>

另一件事是,如果比较运算符的左操作数(-eq-gt-lt-ge-le,{{1} },...)是一个集合,然后运算符返回运算符将产生true的集合的所有项。这种情况下你可以快速过滤一个集合,而不需要-match但是我想真正的优点是你可以编写条件where然后可能意味着两个»如果if ($foo -gt 4)是标量值大于4«或»如果$foo是一个包含大于4的项的集合«而不需要将管道粘贴到$foo

答案 1 :(得分:0)

这是PowerShell尝试转换类型然后进行比较的方式。

检查一下:

$false -eq ""

这也返回True。

答案 2 :(得分:0)

我的第一个猜测是,在第一种情况下,右手操作数从0转换为“0”(左手操作符的类型为字符串),因此“”不等于“0” ”。在第二种情况下,存在从“”到int的转换,并且“”被认为是0。

尝试3 +“”

答案 3 :(得分:0)

执行"" -eq 0时,它与"".equals(0)相同,并返回false。

0 -eq ""会尝试将""转换为in,而[int]""为0,因此您就会成功。