PowerShellの等値演算子が対称関係ではない理由を誰か説明してもらえますか??
PS> "" -eq 0
False
PS> 0 -eq ""
True
はい、-eq
PowerShell では同値関係ではありません。理論家はこの時点で恐怖で叫ぶかもしれませんが、それは主に、言語をアイデアの伝達を改善し、理解しやすくするためです.
たとえば、PowerShellは常に二項演算子の異なる型を左オペランドの型に変換しようとします。これが、質問の動作が見られる理由です。実際には、不自然な例を除いて、これが問題になることはめったにありません。私自身のデータでは、通常、一致する型との比較を記述します。他のデータを扱う場合、変換は通常、意味を損なうという点で害はありません。そして、これは、言語の予測可能性が数学的理想を達成することよりも重要であると私が考えるケースです (コンピューターの数値は数学的実体の近似にすぎないことを考えると、どこでも達成可能でさえありません)。
もう 1 つのことは、比較演算子 ( -eq
、-gt
、-lt
、-ge
、-le
、-match
...) の左オペランドがコレクションである場合、演算子は、演算子が true を返すコレクションのすべての項目を返すことです。where
これは、を必要とせずにコレクションをすばやくフィルタリングできる場合ですが、本当の利点は、「ifが 4 より大きいスカラー値である」または「ifがコレクションである」の両方を意味する条件を記述できることだと思います。パイプラインを.if ($foo -gt 4)
$foo
$foo
if
私の最初の推測では、最初のケースでは、右側のオペランドが 0 から "0" (左側の演算子の型は文字列) に変換されるため、"" は "0" と等しくありません。2 番目のケースでは、"" から int への変換があり、"" は 0 と見なされます。
3 + "" を試してください
これは、PowerShell が型を変換してから比較しようとする方法です。
これをチェックして:
$false -eq ""
これも True を返します。
すると"" -eq 0
、 と同じで"".equals(0)
false を返します。
0 -eq ""
""
inに変換しようとし、 [int]""
0 であるため、true になります。