PowerShell中返回Generic List<String>时类型被转数组的问题求助
PowerShell泛型列表返回后自动转数组的解决办法
问题原因
PowerShell的返回逻辑基于输出流,而非传统编程语言的return语句。当你用return $集合时,PowerShell会自动枚举集合中的所有元素,把它们逐一输出到流中。在函数外部,这些零散的元素会被自动打包成[Object[]]类型的数组,导致原本的泛型列表类型丢失。
解决方法
有两种直接的方式阻止PowerShell自动枚举泛型列表:
方法1:用逗号包装返回值
在返回时,用逗号将泛型列表包裹成单元素数组,PowerShell不会枚举单元素数组的内部对象,这样外部就能接收到原始的泛型列表:
return ,$return
方法2:使用Write-Output -NoEnumerate
替代return语句,用Write-Output的-NoEnumerate参数直接输出泛型列表,禁止枚举行为:
Write-Output $return -NoEnumerate
优化后的完整代码
这里用方法1修改原函数,同时简化内部遍历逻辑:
function PrefixListItems { param ( [System.Collections.Generic.List[String]]$list, [String]$prefix ) $return = [System.Collections.Generic.List[String]]::new() # 直接遍历原List,无需转数组 foreach ($item in $list) { $return.Add("$prefix$item") } Write-Host "in function $($return.GetType())" return ,$return } CLS $first = [System.Collections.Generic.List[String]]@('One', 'Two', 'Three') $result = PrefixListItems -list:$first -prefix:'___' Write-Host "in main $($result.GetType())" # 现在可以正常调用AddRange $targetList = [System.Collections.Generic.List[String]]::new() $targetList.AddRange($result)
运行后你会看到,函数内外的GetType()都会显示System.Collections.Generic.List1[System.String],可以直接用于AddRange`方法。
内容的提问来源于stack exchange,提问作者Gordon
相关产品推荐
相关产品推荐

