PowerShell哈希表整数键为何是KeyCollection类型?双向比较结果异常
问题描述
在PowerShell 7.3.6环境中,用户使用整数作为哈希表键,执行操作时出现两个异常现象:
- 执行
$h.Keys[0].GetType(),返回类型为KeyCollection而非预期的整数类型; - 双向比较结果不一致:
1 -eq $h.Keys[0]返回False,$h.Keys[0] -eq 1返回1。
关键命令输出
PS C:\> $h.Keys[0].GetType() # 预期返回整数类型,实际返回KeyCollection IsPublic IsSerial Name BaseType -------- -------- ---- -------- False False KeyCollection System.Object PS C:\> 1 -eq $h.Keys[0] # 双向比较结果不一致 False PS C:\> $h.Keys[0] -eq 1 1 PS C:\> $PSVersionTable.PSVersion.ToString() 7.3.6
完整复现脚本
$h = @{} $hi1 = @{1='a';2='b'} # 创建嵌套哈希表 $h.GetType() # 确认是哈希表类型 $h.Count # 初始为空,返回0 $h[1] += @($hi1) # 向哈希表中添加数组类型的值 $h[1] # 查看键1对应的值 $h[1].Count # 值为数组,返回元素数量1 $h[1].GetType() # 确认值的类型是数组 $h[1][0] # 查看数组中的第一个元素 $h[1][0].GetType() # 确认元素是哈希表 $h.Keys # 查看哈希表的所有键(仅包含1) $h.Keys.GetType() # 确认Keys属性的类型是KeyCollection $h.Keys[0] # 输出显示为1,但实际类型并非整数 $h.Keys[0].GetType() # 返回KeyCollection类型 1 -eq $h.Keys[0] # 返回False $h.Keys[0] -eq 1 # 返回1
问题原因与解释
1. 为什么$h.Keys[0]的类型是KeyCollection而非整数?
哈希表的Keys属性返回的是KeyCollection类型,该集合不支持直接索引访问(未实现[]索引器)。
执行$h.Keys[0]时,PowerShell并没有返回集合中的第一个键,而是直接返回KeyCollection对象本身。你看到输出显示1,是因为PowerShell在输出集合对象时会自动枚举其元素,但变量的实际类型依然是KeyCollection,这就是GetType()返回该类型的原因。
若要正确获取第一个键,需先将KeyCollection转换为数组再访问:
# 两种可行方式 $firstKey = $h.Keys | Select-Object -First 1 $firstKey = @($h.Keys)[0]
2. 为什么双向比较结果不一致?
这是PowerShell中-eq运算符的方向性行为差异导致的:
- 执行
1 -eq $h.Keys[0]时,左边是标量整数1,右边是KeyCollection对象。PowerShell会直接比较标量与集合对象是否相等,两者类型不同,因此返回False。 - 执行
$h.Keys[0] -eq 1时,左边是KeyCollection集合,右边是标量整数1。PowerShell会枚举集合元素并检查匹配,找到值为1的元素后返回该元素,因此输出1(布尔上下文中等价于True)。
内容的提问来源于stack exchange,提问作者lit
相关产品推荐
相关产品推荐

