2010-09-19 102 views
3

任何人有任何想法,爲什麼下面的代碼會產生一個錯誤,詳細信息請參閱PowerShell的錯誤返回哈希表

功能後附加註釋
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 

錯誤消息: 不能轉換「System.Object的[]」類型「System.Object []」的值鍵入「System.Collections.Hashtable」。

我收到各種實例的錯誤,我試圖縮小到一個很容易重現的例子。它看起來像是將哈希表更改爲對象數組,這就是爲什麼它不會返回它?它允許我修改哈希表並返回它,但是當我嘗試顯示它時,它會改變它?當我開始向被調用函數添加代碼時,這與我獲得的效果是一樣的嗎?

回答

8

當你取消註釋# $hashtable你正在輸出兩個東西從函數。函數的結果是它的一切「輸出」,PowerShell會自動將多個輸出包裝到一個數組中。 return語句是一個短路便利性,不應該與從函數返回值的唯一方法混淆。

+0

類似的問題在這裏http://stackoverflow.com/questions/2158786/calling-echo-inside-a-function-pre-pends-echo-string-to-return-value-in-powershel – 2010-09-19 03:59:27

+2

同意。我建議不要在PowerShell中使用成語'return ',因爲它具有誤導性。它在功能上等同於'Write-Output ; return'。最好把'$ hashtable'作爲函數的最後一行,並稱它很好(就像* caller *函數一樣)。 – 2010-09-19 06:20:27