power shell 中的 -eq 关键字测试引用相等性还是使用 Object.Equals()

问题描述 投票:0回答:2

Powershell 中的“-eq”是否测试引用相等性(如 c# 中的“==”)或者是否执行与调用 Object.Equals() 等效的操作

.net powershell equality
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
成功的原因。


4
投票

运算符 -eq 不是(如 c# 中的“==”)和 Object.Equals()。简单的例子:它执行不区分大小写的字符串比较。事实上,它在幕后执行了大量转换,不幸的是,其中一些转换可能并不总是直观地预期的。

这里有一些有趣的演示

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

# this is True in older versions of PowerShell
# but "more expected" False in PowerShell v5.1+
$true -eq [ConsoleColor]::Black
© www.soinside.com 2019 - 2024. All rights reserved.