有人可以向我解释为什么PowerShell中的相等运算符不是对称关系吗?
PS> "" -eq 0
False
PS> 0 -eq ""
True
答案 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,因此您就会成功。