tl;dr
在 PowerShell 的条件语句/隐式布尔上下文中:
当左侧是一个数组时,像-eq
这样的数组感知运算符不可避免地也会输出一个数组。
由于您的数组元素都是$null
并且您与$null
进行比较,您的比较实际上是一个有效的无操作 - 例如,@( $null ) -eq $null
的结果是@( $null )
,而您的条件语句等效于:
[bool] @( $null, $null )
[bool] @( $null )
或许令人惊讶的是,隐式布尔逻辑将管道逻辑应用于数组:
也就是说,一个单元素数组(在概念上)被解开,并且其元素被解释为布尔值。
因此,[bool] @( $null ) 被视为与 [bool] $null 相同,即 $false。
通常情况下,@( )(或者, )在布尔上下文中被视为与 相同。
相比之下,如果一个数组有2个或更多元素,在布尔上下文中它总是 $true,即使其中的每个元素都被认为是 $false。
测试任意数组是否为空的解决方法:
以.Count
属性为条件进行判断:
if ( (<array>).Count ) { $true } else { $false }
您可以添加
-gt 0
,但这并不是严格必要的,因为任何非零值都隐式地表示
$true
。
应用于您的示例:
PS> if ( ( @($null) -eq $null ).Count ) { $true } else { $false }
True
测试一个任意值是否为(标量)$null
:
if ($null -eq <value>) { $true } else { $false }
请注意,为了防止数组过滤逻辑生效,
$null
必须作为 LHS 使用,如果
<value>
是一个数组。
这也是为什么使用 PowerShell 扩展的 Visual Studio Code 建议将 "$null 放在比较的左侧",如果你写类似于
$var -eq $null
的代码。
[1]
布尔转换摘要:
- 在诸如数组(更准确地说,实现了
IList
接口的类似集合类型 - 请参阅源代码)之类的集合中: