3

PowerShell Logicのおかげで-eq、左側のオペランドがブール値ではなくコレクションの-eq場合に、右側のオペランドと等しい要素の配列を返す場合の複雑な動作に精通しています。3.0仕様から:

左オペランドで指定された値がコレクションでない場合、結果は bool 型になります。それ以外の場合、結果は、右側のオペランドで指定された値と比較したときに True をテストするコレクションの要素を含む、空の可能性のある制約のない 1 次元配列になります。

そうは言っても、私にはまったく意味のないケースが見つかりました。配列でもある要素で配列を宣言すると、実際には-eqその要素と一致するようになりません。

$a = @( 1, @(2, 3) )
$a -eq 1              # results in an array with a single element, containing 1
$a -eq @( 2, 3 )      # results in an empty array

どうしたの?これが混合型の配列要素をラップする PowerShell なのか、2 次元配列をラップするのか、値と参照型の等価性チェックの問題なのか、またはそれらのサブセットなのかを判断するのは特に簡単ではありません。

4

1 に答える 1

2

.NET での配列比較は、2 つのオブジェクトが同じオブジェクトを参照していることのみを比較し、それらが同等の値を持っていることを比較しないという事実に関係していると思います。検討:

# ~> @(2,3).Equals(@(2,3))
False

# ~> $arr = @(2,3)

# ~> $arr.Equals($arr)
True

# ~> $arr.Equals(@(2,3))
False

# ~> @(1, $arr) -eq $arr
2
3
于 2013-05-04T00:54:25.817 に答える