簡體   English   中英

為什么我的 PowerShell 函數返回 Object[] 而不是 string[]?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM