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

Nac*_*ica 9 powershell

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

PS> "" -eq 0
False
PS> 0 -eq ""
True
Run Code Online (Sandbox Code Playgroud)

Joe*_*oey 10

是的,-eq在PowerShell中不是等价关系.虽然理论家们在这一点上可能会惊恐万分,但主要是为了使语言更好地传达思想和简化理解.

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

另一件事是,如果比较操作符(左操作数-eq,-gt,-lt,-ge,-le,-match,...)是一个集合,然后操作员返回集合,其中运营商将产生真正的所有项目.这将是在这里您可以快速筛选集合而不需要的情况下where,我想真正的好处是,你可以写条件if ($foo -gt 4),然后既可以指»如果$foo是标量值比4«大或»如果$foo是一家集包含大于4«的项目,而无需将管道粘入if.

  • 我不同意它使语言更好地传达思想,或更容易理解。相等运算符应该传达相等性。如果 .Equals 方法是我们想要的,那么它仍然可用。 (2认同)
  • 作为一个运算符,不应该先将两个操作数都转换为 [bool],然后再比较它们吗?这对我来说几乎同样简单,并且可以避免巨大的混乱,正如我最近经历的那样。并不是所有运算符在操作发生之前都将其操作数转换为相同类型 - 因为某些运算符要求其操作数为不同类型,例如 -contains。 (2认同)