Я хочу вернуть 2 hashset<string>
из функции и не хочу, чтобы ее тип возвращаемого значения изменялся на строку, если hashset<string>
содержит только 1 строковый элемент.
Сначала вернем 1 переменную стип не меняется, мы можем использовать запятую перед переменной, чтобы сохранить тип возвращаемого значения:
Function Foo1 {
$set1 = New-Object "System.Collections.Generic.HashSet[string]"
$set1.Add("set 1") | Out-Null
return ,$set1
}
$set1 = Foo1
Затем, чтобы вернуть несколько переменных и сохранить тип возвращаемого значения, я все еще могу использовать запятая перед переменной:
function Foo2 {
$set1 = New-Object "System.Collections.Generic.HashSet[string]"
$set2 = New-Object "System.Collections.Generic.HashSet[string]"
$set1.Add("set 1") | Out-Null
$set2.Add("set 2") | Out-Null
return ,$set1, $set2
}
Но первый вызывающий метод может получить неправильный ответ:
$set1, $set2 = Foo2
Write-Host $set1.GetType() # System.Object[]
Write-Host $set2.GetType() # System.Collections.Generic.HashSet`1[System.String]
И этот вызывающий метод может получить правильный ответ:
,$set1, $set2 = Foo2
Write-Host $set1.GetType() # System.Collections.Generic.HashSet`1[System.String]
Write-Host $set2.GetType() # System.Collections.Generic.HashSet`1[System.String]
Мой вопрос 1: В чем разница между этими двумя вызывающими методами и почему они действуют по-разному?
Мой вопрос 2: Можетмы используем явное преобразование, чтобы сохранить тип возвращаемого значения вместо запятой?
[System.Collections.Generic.HashSet[string]]$set1, [System.Collections.Generic.HashSet[string]]$set2 = Foo2