我可以创建[System.Collections.Specialized.NameValueCollection]
类型的新实例,它似乎工作正常。但是如果我在函数内部执行,然后返回对象,则调用者会收到[String]
(如果集合只包含单个项目)或[Object[]]
如果它包含多个项目(然后每个该数组中的项目是表示其中一个键的[String]
。
可以使用以下代码复制:
function Test-ReturnType {
[CmdletBinding()]
param()
$nvc = New-Object System.Collections.Specialized.NameValueCollection
Write-Verbose $nvc.GetType() -Verbose
$nvc.Add('Name1','Value1')
$nvc.Add('Name2','Value2')
$nvc
}
$r = Test-ReturnType
Write-Verbose $r.GetType() -Verbose
我已确认.Add()
方法的返回类型为[void]
,并且Out-Null
的管道不会改变行为。
我尝试在函数中添加[OutputType()]
属性,即使我知道这仅用于文档。
我尝试在函数的最后一行(无效)中投射$nvc
。
我已尝试投射$r
和Test-ReturnType
的返回值(例外,无法转换)。
我只是不明白为什么这是不可能的。
如果我创建一个新的[System.Net.WebClient]
并从函数中返回它,它就可以正常工作。
为什么[System.Collections.Specialized.NameValueCollection]
会在返回时变成其存储的值?
答案 0 :(得分:2)
Powershell在这里“非常有帮助”,并为你解开你的收藏,就像它展开数组/等一样。当他们进入管道时。
你需要通过为powershell添加一层数组/包装来“防止”,而不是打开包装。
请尝试,$nvc
作为最后一行。
有关powershell展开的一些讨论,请参阅this question。
答案 1 :(得分:1)
我发现了另一种解决方法。返回对象的引用:
[ref]$nvc
唯一的问题是,调用者在使用它之前必须取消引用它:
$r = Test-ReturnType
$r.value.GetType()
所以绝对不如一元,
好,但仍然有趣。