9

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

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

4 回答 4

10

是的,-eq在 PowerShell 中不是等价关系。虽然理论家此时可能会惊恐万分,但这主要是为了让语言更好地传达思想并更易于理解。

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

另一件事是,如果比较运算符 ( -eq, -gt, -lt, -ge, -le, -match, ...) 的左操作数是一个集合,则该运算符将返回该运算符将产生 true 的集合中的所有项。在这种情况下,您可以在不需要 a 的情况下快速过滤集合where我想真正的优势是您可以编写条件if ($foo -gt 4),这可能意味着 »if$foo是一个大于 4 的标量值« 或 »if$foo是一个集合包含大于 4« 的物品,无需将管道插入if.

于 2012-04-17T06:13:36.627 回答
0

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

检查这个:

$false -eq ""

这也返回 True 。

于 2012-04-17T06:06:51.067 回答
0

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

试试 3 + ""

于 2012-04-17T06:12:40.380 回答
0

当你这样做时"" -eq 0,它与它相同"".equals(0)并且它返回false。

0 -eq ""将尝试转换""为 in 并且[int]""为 0,因此你得到了真实的结果。

于 2012-04-17T06:17:36.330 回答