Делает-eq ключевое слово в питании, окружают тестовое ссылочное равенство или используют Объект. Равняется ()

Делает "-eq" в ссылочном равенстве теста Powershell (как "==" в c#) или делает это делает эквивалент вызывающего объекта. Равняется ()

6
задан Willbill 28 April 2010 в 13:04
поделиться

2 ответа

Проверка на равенство не так проста.

Учтите, что '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 успешно.

6
ответ дан 10 December 2019 в 00:35
поделиться

Оператор -eq не является ни одним из (например, "==" в C #) и Object.Equals (). Простой пример: выполняется сравнение строк без учета регистра. Фактически, он выполняет множество скрытых преобразований, и некоторые из них, к сожалению, не всегда могут быть интуитивно ожидаемы.

Вот интересная демонстрация

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

# this is True
$true -eq [ConsoleColor]::Black
4
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: