有人可以向我解释为什么PowerShell中的相等运算符不是对称关系吗?
PS> "" -eq 0
False
PS> 0 -eq ""
True
是的,-eq
在 PowerShell 中不是等价关系。虽然理论家此时可能会惊恐万分,但这主要是为了让语言更好地传达思想并更易于理解。
例如,PowerShell总是尝试将二进制运算符中的不同类型转换为左操作数的类型,这就是您在问题中看到行为的原因。在实践中,我发现这几乎不是问题,除了人为的例子。在我自己的数据中,我通常会编写与匹配类型的比较,并且在使用其他数据时,转换通常不会有害,因为它们会破坏含义。在这种情况下,我认为语言的可预测性比获得数学理想更重要(鉴于计算机中的数字只是数学实体的近似值,无论如何这在任何地方都无法实现)。
另一件事是,如果比较运算符 ( -eq
, -gt
, -lt
, -ge
, -le
, -match
, ...) 的左操作数是一个集合,则该运算符将返回该运算符将产生 true 的集合中的所有项。在这种情况下,您可以在不需要 a 的情况下快速过滤集合where
,但我想真正的优势是您可以编写条件if ($foo -gt 4)
,这可能意味着 »if$foo
是一个大于 4 的标量值« 或 »if$foo
是一个集合包含大于 4« 的物品,无需将管道插入if
.
这是 PowerShell 尝试转换类型然后进行比较的方式。
检查这个:
$false -eq ""
这也返回 True 。
我的第一个猜测是,在第一种情况下,右手操作数从 0 转换为“0”(左手运算符的类型是字符串),因此“”不等于“0”。在第二种情况下,存在从“”到int的转换,“”被认为是0。
试试 3 + ""
当你这样做时"" -eq 0
,它与它相同"".equals(0)
并且它返回false。
0 -eq ""
将尝试转换""
为 in 并且[int]""
为 0,因此你得到了真实的结果。