Arrays 在Powershell中测试null:为什么测试空数组的行为与测试空字符串的行为不同?
考虑一下这个代码Arrays 在Powershell中测试null:为什么测试空数组的行为与测试空字符串的行为不同?,arrays,powershell,types,null,Arrays,Powershell,Types,Null,考虑一下这个代码 "Type: array" $v = @() " -eq `$null: $($v -eq $null)" " -ne `$null: $($v -ne $null)" "Type: string" $v = '' " -eq `$null: $($v -eq $null)" " -ne `$null: $($v -ne $null)" 这将产生以下结果: Type: array -eq $null: -ne $null: Type: string
"Type: array"
$v = @()
" -eq `$null: $($v -eq $null)"
" -ne `$null: $($v -ne $null)"
"Type: string"
$v = ''
" -eq `$null: $($v -eq $null)"
" -ne `$null: $($v -ne $null)"
这将产生以下结果:
Type: array
-eq $null:
-ne $null:
Type: string
-eq $null: False
-ne $null: True
-eq
和-ne
对空字符串的行为与预期的一样,但对空数组的计算结果为null或empty$null
和空数组对集合使用比较运算符时,它们不会返回布尔值($true或$false)。它们返回集合中满足条件的所有成员 见: 获取帮助@mjolinor’s是对问题(1)的简单而正确的回答。这个答案实际上引出了另外两个问题 声明如下: 当输入是一组值时 比较运算符返回任何匹配的值。如果没有匹配项 在集合中,比较运算符不返回任何内容 这意味着该行为取决于Powershell在此上下文中对“集合”的定义。这也意味着交换比较运算符的LHS和RHS可能会产生实质性差异 因此,除了最初的问题2,我们还有两个未回答的问题:
$null
和空数组$null
和空数组$null-eq@()
)会为所有测试类型生成一个布尔值(请参见列coll\u RHS\u result
)。这意味着$null-ne@()
的计算结果与预期一致,这使我们能够可靠地检测$null
和@()
之间的差异
coll\u LHS\u结果
为Object[]
的每种类型
哦这有点道理。但是为什么
@()-eq$null
的计算结果不是真的呢?@alx9r这个答案可能取决于您的PowerShell版本。在3.0中,我的计算结果为False。@()-eq$null将返回等于$null的空数组的所有成员,因此结果将为null,而不是$true。请注意,$()-eq$null确实返回$true$()的计算结果为标量(单个)空值。@mjolinor您能告诉我(或链接到)$()
的含义是什么吗?google和stackoverflow搜索都没有找到该字符串的任何内容。这是一个子表达式。请参阅获取有关_运算符的帮助。还有另一个有趣的相关问题-一般来说,对象(特别是集合)是如何转换/转换为布尔值(真/假)的,以便对语句进行求值的,例如if($x)
?答案在于系统、管理、自动化、语言原语。IsTrue
:
CollectionType x_eq_Null coll_LHS_result Null_eq_x coll_RHS_result
-------------- --------- --------------- --------- ---------------
string False Boolean False Boolean
ArrayList {} Object[] False Boolean
Hashtable False Boolean False Boolean
Queue {} Object[] False Boolean
SortedList False Boolean False Boolean
Stack {} Object[] False Boolean
Dictionary False Boolean False Boolean
List {} Object[] False Boolean
Null True Boolean True Boolean
boolean False Boolean False Boolean
int32 False Boolean False Boolean
char False Boolean False Boolean
('string', ('')),
('ArrayList', (New-Object System.Collections.ArrayList)),
('Hashtable', (New-Object System.Collections.Hashtable)),
('Queue', (New-Object System.Collections.Queue)),
('SortedList', (New-Object System.Collections.SortedList)),
('Stack', (New-Object System.Collections.Stack)),
('Dictionary', (New-Object "System.Collections.Generic.Dictionary``2[System.String,int32]")),
('List', (New-Object System.Collections.Generic.List``1[int32])),
('Null', ($null)),
('boolean', ($false)),
('int32', ([int32]0)),
('char', ([char]"`0")) |
% {
New-Object PSObject -Property @{
CollectionType = $_[0]
x_eq_Null = $_[1] -eq $null
coll_LHS_result = ($_[1] -eq $null).GetType().Name
Null_eq_x = $null -eq $_[1]
coll_RHS_result = ($null -eq $_[1]).GetType().Name
}
} |
select CollectionType,x_eq_Null,coll_LHS_result,Null_eq_x,coll_RHS_result |
ft -AutoSize