[英]Why does my PowerShell function return Object[] instead of string[]?
我編寫了以下函數將字符串拆分為字符串數組。 在某些情況下,輸入是 $null,在這種情況下函數應該返回 $null,或者當輸入已經是字符串數組時,在這種情況下輸入應該按原樣返回。
function Split-Tests($tests)
{
if ($tests -eq $null)
{
return $tests
}
if (($tests.GetType() -eq [string[]]) -and $tests.Count -ne 1)
{
return $tests
}
return ([string]$tests).Split(",")
}
該函數應返回 $null 或字符串數組。 但是,當我像Split-Tests "1,2,3"
一樣調用這個函數時,即使 string.Split 函數返回 string[],返回值的類型也是 object[]。
我嘗試對 string[] 進行顯式轉換( return [string[]](([string]$tests).Split(","))
),然后嘗試了[OutputType([string[]])]
屬性,但返回類型仍為 object[]。
作為最后的手段,我將函數調用的結果轉換為 [string[]]。 那行得通,但我寧願在函數外部定義返回類型。 你能幫助我嗎?
編輯:我發現這個答案表明我可以在“return”和返回值之間添加一個逗號。 不幸的是,就我而言,它沒有幫助。 甚至此回復中提到的“寫入輸出”也沒有進行更改。
再次編輯:逗號技巧做到了,我第一次嘗試時一定做錯了什么。
這是正常行為。 與其他編程語言不同,PowerShell展開數組並將它們逐個元素地輸出到管道,作為流。 即使 PowerShell 中的return
語句實際上也不會按原樣返回給定的對象,但也會輸出到管道。
IE。
return ([string]$tests).Split(",")
只是一個捷徑:
([string]$tests).Split(",") # Output to the pipeline
return # Return from the function
當輸出被捕獲到一個變量中時,PowerShell 只會看到傳遞給管道的各個元素。 它不知道原始數組類型。 由於管道中的值可能是不同的類型,它只能創建一個通用的object[]
數組,它接受任何元素類型。
Function Fun { return 1,2,3,'a','b','c' }
$x = Fun # Now x contains 3 ints and 3 strings.
要強制輸出string[]
數組,可以在數組前面使用一元形式的逗號運算符來防止枚舉:
function Split-Tests( $tests)
{
if ($tests -eq $null)
{
return $tests
}
if (($tests.GetType() -eq [string[]]) -and $tests.Count -ne 1)
{
return ,$tests
}
,([string]$tests).Split(",") # No return statement needed here
}
$a = Split-Tests "1,2,3"
$a.GetType().Name # Outputs "String[]"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.