views:

65

answers:

1

Anyone have any ideas why the following code would produce an error, see additional comments after the function for more details

function callee    ([Hashtable]$arg0) {
    [Hashtable]$hashtable = @{}
    $hashtable = $arg0
    $hashtable.add('passed', $True)
    # $hashtable                            ######## toggle this line
    $type = $hashtable.GetType()
    Write-Host "$type"
    return $hashtable
}

function caller {
    [Hashtable]$hashtable = @{'00'='0'}
    $hashtable = callee $hashtable        ##### returns error here
    $hashtable.add('returned', $True)
    $hashtable
}
caller

error message: Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Collections.Hashtable".

I receive the error on a variety of instances, I tried to narrow it down to an example that is easy to reproduce. It looks like it is changing the hashtable to an object array and that is why it won't return it? It allows me to modify the hashtable and return it but when I try to display it it changes it? This is the same effect I get when I start adding code to the callee function?

+4  A: 

When you uncomment # $hashtable you're outputting two things from the function. The result of the function is everything 'output' from it, and PowerShell will automatically wrap multiple outputs into an array. The return statement is a short-circuit convenience and should not be confused with the only way to return a value from the function.

Sean Fausett
Similar question here http://stackoverflow.com/questions/2158786/calling-echo-inside-a-function-pre-pends-echo-string-to-return-value-in-powershel
Sean Fausett
Agreed. I recommend against using the idiom `return <expr>` in PowerShell because it is misleading. It is functionally equivalent to `Write-Output <expr>; return`. Best just to put `$hashtable` as the last line of the function and call it good (just like the *caller* function does).
Keith Hill