Делает "-eq" в ссылочном равенстве теста Powershell (как "==" в c#) или делает это делает эквивалент вызывающего объекта. Равняется ()
Проверка на равенство не так проста.
Учтите, что 'a' -eq 'A'
возвращает истину. Это означает, что 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
успешно.
Оператор -eq не является ни одним из (например, "==" в C #) и Object.Equals (). Простой пример: выполняется сравнение строк без учета регистра. Фактически, он выполняет множество скрытых преобразований, и некоторые из них, к сожалению, не всегда могут быть интуитивно ожидаемы.
Вот интересная демонстрация
# this is False
[ConsoleColor]::Black -eq $true
# this is True
$true -eq [ConsoleColor]::Black