我定義的Array
整個元素代替:陣列返回的第一個元素字符
function GetNames
{
$names = New-Object System.Collections.ArrayList
$names += "Drin"
$names
}
現在我想從Array
採取的第一個名字:
$names = GetNames
$firstName = $names[0]
因此,現在的$firstName
收到Drin
我得到D
我定義的Array
整個元素代替:陣列返回的第一個元素字符
function GetNames
{
$names = New-Object System.Collections.ArrayList
$names += "Drin"
$names
}
現在我想從Array
採取的第一個名字:
$names = GetNames
$firstName = $names[0]
因此,現在的$firstName
收到Drin
我得到D
如果您檢索的類型$names
使用GetType()
你會看到,$names
實際上是一個字符串 - 這樣你,如果你訪問的第一個索引的第一個字符:
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
注:這是因爲你只需要在管道單個元素。要強制$names
是一個數組,你必須明確地聲明它:
$names = @(GetNames)
還要注意的是,你不必使用New-Object
創建一個數組。您也可以使用它聲明:
function GetNames
{
@('Drin')
}
如果你運行你的代碼,是的,但把$names.GetType()
中的每一行之間你得到這樣的:
$names = New-Object System.Collections.ArrayList
$names.GetType()
$names += "Drin"
$names.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True ArrayList System.Object
True True Object[] System.Array
通過調用$names += "Drin"
你重新定義的類型$names
。這並不直觀(至少對我來說是一個C#開發),但這就是發生了什麼。
如果用.Add(...)
方法做它,然後它會很好地工作:
$names = New-Object System.Collections.ArrayList
$names.GetType()
$names.Add("Drin")
$names.GetType()
$names[0]
這給:
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True ArrayList System.Object 0 True True ArrayList System.Object Drin
類型的$names
保持不變,你會得到正確的結果出來。
正確的方法是避免使用ArrayList
(它是如此2001年後)。取而代之的是@()
。試試這個:
$names = @()
$names.GetType()
$names += "Drin"
$names.GetType()
$names[0]
這給:
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array True True Object[] System.Array Drin
正如馬丁在評論中指出,該功能應該是這樣的:
function GetNames
{
$names = @()
$names += "Drin"
$names
}
您提供的信息是正確的,但不會解決他的問題... –
@MartinBrandl - 怎麼樣? – Enigmativity
如果複製他的函數並將代碼粘貼到其中並使用'$ names = GetNames'調用它,您將看到'$ names [0]'仍然返回'D''。這是因爲你必須將函數的* return *值強制轉換爲數組。這就是這裏的實際問題(除了你提到的他也可以使用@()) –
也是一種有趣的方式來做到這一點:' $ names =,(GetNames)' – 4c74356b41