身份运算符/没有隐式类型转换的比较
Identity Operator / Comparison without Implicit Type Conversion
在使用 PowerShell 时,我们偶尔会比较不同类型的对象。一个常见的场景是 $int -eq $bool
(即 0 -eq $false
、0 -ne $true
,并且任何非零值只等于 true,而不等于 false)。
大多数情况下这是件好事;有时这很痛苦(例如,如果我正在寻找一个对象的所有具有值 1
的属性,但我不想要所有具有值 $true
的属性)。
问题
是否有一个运算符可以在不进行转换的情况下执行此比较;即本质上与 JavaScript 的身份运算符 (===
) 相同;?
加分题
如果有这样的运营商,有容忍度吗?也就是说,虽然我不想将 1
和 true
视为相同,但如果我可以将 [int]1
和 [long]1
视为相同(有时)会有所帮助.
PowerShell 不直接提供此类运算符,但您可以使用标准 .NET 方法 [Object]::Equals
进行此类比较。
注:
它允许类型通过覆盖虚拟 Object.Equals
方法来实现它们自己的相等性比较,因此如果某些自定义类型不正确地实现它,可能会出现一些奇怪的行为。但是所有标准 .NET 类型都应该没问题,并且认为它们自己只等于相同类型的实例。
在使用 PowerShell 时,我们偶尔会比较不同类型的对象。一个常见的场景是 $int -eq $bool
(即 0 -eq $false
、0 -ne $true
,并且任何非零值只等于 true,而不等于 false)。
大多数情况下这是件好事;有时这很痛苦(例如,如果我正在寻找一个对象的所有具有值 1
的属性,但我不想要所有具有值 $true
的属性)。
问题
是否有一个运算符可以在不进行转换的情况下执行此比较;即本质上与 JavaScript 的身份运算符 (===
) 相同;?
加分题
如果有这样的运营商,有容忍度吗?也就是说,虽然我不想将 1
和 true
视为相同,但如果我可以将 [int]1
和 [long]1
视为相同(有时)会有所帮助.
PowerShell 不直接提供此类运算符,但您可以使用标准 .NET 方法 [Object]::Equals
进行此类比较。
注:
它允许类型通过覆盖虚拟 Object.Equals
方法来实现它们自己的相等性比较,因此如果某些自定义类型不正确地实现它,可能会出现一些奇怪的行为。但是所有标准 .NET 类型都应该没问题,并且认为它们自己只等于相同类型的实例。