Casting explícito de tipo de parâmetro
O segundo exemplo que você postou (explicitamente lançando a variável de parâmetro) é o caminho correto a seguir:
Function Test-Me {
Param(
[System.Collections.ArrayList]
$Properties = @("red","blue","green")
)
Write-Host $Properties.GetType().FullName
if("Orange" -notin $Properties){
[void]$Properties.Add("orange")
}
$Properties
}
Como resultado:
PS C:\> Test-Me
System.Collections.ArrayList
red
blue
green
orange
PS C:\> Test-Me -Properties "one","two","three"
System.Collections.ArrayList
one
two
three
orange
OutputType
Uma coisa que me surpreendeu, porém, é que, mesmo com o atributo [OutputType]
, a função gera uma matriz regular (isso pode ser um comportamento desejado
Function Test-Me {
[OutputType([System.Collections.ArrayList])]
Param(
[System.Collections.ArrayList]
$Properties = @("red","blue","green")
)
if("Orange" -notin $Properties){
[void]$Properties.Add("orange")
}
$Properties
}
Ainda resultando em uma matriz de objetos regular sendo retornada:
PS C:\> (Test-Me).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
Atualizar (com solução fácil)
Conforme demonstrado no comentário sobre o seu Conectar envio de bugs , o PowerShell deliberadamente enumera os itens de qualquer enumerável saída para fornecer um comportamento consistente para o pipeline (pseudo-C # roubado do comentarista Derp McDerp no Connect):
if (returned_value is IEnumerable) {
foreach (r in returned_value) {
yield r;
}
} else {
yield returned_value;
}
O truque é envolver a coleção em uma matriz de item único, fazendo com que o PowerShell canalize-a como um único item (observe para ,
antes de $Properties
):
Function Test-Me {
[OutputType([System.Collections.ArrayList])]
Param(
[System.Collections.ArrayList]
$Properties = @("red","blue","green")
)
if("Orange" -notin $Properties){
[void]$Properties.Add("orange")
}
,$Properties
}
e agora, obtemos uma saída com o tipo correto:
PS C:\> (Test-Me).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True ArrayList System.Object