为什么整数哈希键不是整数?该键的类型为 KeyCollection,即使它是从常量整数创建的。
产生此输出的脚本如下。我将仅显示最后三 (3) 行命令行。为什么键不是某种类型的整数?
PS C:\> $h.Keys[0].GetType() # the type of the first and only item in the set of keys is KeyCollection, not an int of some kind
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
False False KeyCollection System.Object
PS C:\> 1 -eq $h.Keys[0] # comparing 1 and the key both ways produces different results ???
False
PS C:\> $h.Keys[0] -eq 1
1
PS C:\> $PSVersionTable.PSVersion.ToString()
7.3.6
这是导致此情况的脚本。
$h = @{}
$hi1 = @{1='a';2='b'} # create a hash
$h.GetType() # yes, it is a hashtable
$h.Count # there should be none (0) at this point
$h[1] += @($hi1) # put an array containing a hash into h
$h[1] # check to see that the array containing a hash is in the hash h
$h[1].Count # there should be one (1) item in the hash
$h[1].GetType() # the item at hash index 1 should be an array
$h[1][0] # this is the first and only element in the array
$h[1][0].GetType() # the first item in the array is a hashtable
$h.Keys # there is only one key in the hash
$h.Keys.GetType() # the type of the Keys object is a KeyCollection
$h.Keys[0] # the first and only item in the set of keys is 1
$h.Keys[0].GetType() # the type of the first and only item in the set of keys is KeyCollection, not an int of some kind
1 -eq $h.Keys[0] # comparing 1 and the key both ways produces different results ???
$h.Keys[0] -eq 1
看起来这个问题可能已经在这里得到解答
如果这没有帮助,
据我了解,该
Keys
属性返回的 KeyCollection 对象没有索引(也没有内置迭代器)。因此,当您尝试索引索引为 0 的对象时,PowerShell 只是返回整个对象。例如,如果您尝试访问索引 1,您将一无所获。您应该能够通过执行类似的操作将 Keys 对象转换为数组
[Array]$keys_arr = $h.Keys
。然后,您可以访问该数组上的索引以获取您的心内容(只需注意键的顺序似乎是向后的?我假设在这种情况下键顺序可能未定义)或者,如果您只需要访问特定索引,您可以这样做
([Array]$h.Keys)[0] -eq ...
除了上面链接的 SO 帖子之外,您还可以在这篇 Reddit 帖子中阅读有关 KeyCollections 的更多信息。
至于为什么在翻转相等语句时会得到不同的结果, Jeroen Mostert 对另一个答案的评论似乎很好地解释了 PWSH 中 -eq 的非对称性质:
希望这可以帮助!