6

Powershell の "-eq" は等価性をテストしますか (C# の "==" のように)、または Object.Equals() の呼び出しと同等のことを行いますか?

4

2 に答える 2

6

平等のテストはそれほど単純ではありません。

'a' -eq 'A'true を返すと考えてください。つまり、PowerShell は Equals を呼び出すだけではありません。

さらに、オブジェクトEqualsが期待どおりに呼び出されます。

Add-Type -TypeDefinition @"
    using System;
    public class X {
        public string Property;
        public X(string s) {
            Property = s;
        }
        public override bool Equals(object o) {
            System.Console.WriteLine("equals on {0}", Property);
            return Property == ((X)o).Property;
        }
        public override int GetHashCode() { return 20; }
    }
"@

$o1 = New-Object X 'a'
$o2 = New-Object X 'A'

$o1 -eq $o2

それに加えて、PowerShell は変換をかなり頻繁に使用します。したがって、オペランドが同じ型でない場合、右側のオペランドは左側のオペランドの型に変換されます。だからこそ'1' -eq 1成功する。

于 2010-04-28T14:32:19.677 に答える
4

演算子 -eq は (c# の "==" のように) および Object.Equals() のいずれでもありません。簡単な例: 大文字と小文字を区別しない文字列比較を実行します。実際、内部で多くの変換を実行しますが、残念ながら、それらのいくつかは、必ずしも直感的に期待できるとは限りません。

ここにいくつかの興味深いデモがあります

# this is False
[ConsoleColor]::Black -eq $true

# this is True
$true -eq [ConsoleColor]::Black
于 2010-04-28T14:06:06.593 に答える