为什么我不能返回System.Collections.Specialized.NameValueCollection类型的值?

时间:2015-08-20 12:48:17

标签: .net function powershell return-type powershell-v4.0

我可以创建[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

我已尝试投射$rTest-ReturnType的返回值(例外,无法转换)。

我只是不明白为什么这是不可能的。

如果我创建一个新的[System.Net.WebClient]并从函数中返回它,它就可以正常工作。

为什么[System.Collections.Specialized.NameValueCollection]会在返回时变成其存储的值?

2 个答案:

答案 0 :(得分:2)

Powershell在这里“非常有帮助”,并为你解开你的收藏,就像它展开数组/等一样。当他们进入管道时。

你需要通过为powershell添加一层数组/包装来“防止”,而不是打开包装。

请尝试,$nvc作为最后一行。

有关powershell展开的一些讨论,请参阅this question

答案 1 :(得分:1)

我发现了另一种解决方法。返回对象的引用:

[ref]$nvc

唯一的问题是,调用者在使用它之前必须取消引用它:

$r = Test-ReturnType
$r.value.GetType()

所以绝对不如一元,好,但仍然有趣。