【发布时间】:2019-06-27 13:14:23
【问题描述】:
我有一个函数(实际上是这个函数的几个实例),但有时它可能会返回一个包含多个元素的列表,有时它可能会返回一个元素。我希望该函数每次都返回一个数组 ([System.Object[]]),以便(在接收端)我总是可以预期它是一个数组并对其进行索引,即使我只是拉出第 0 个元素。
我尝试过多种方式转换返回类型(参见下面的代码)......包括(例如)return @("asdf")、return [System.Object[]]@("asdf") 和类似的,但似乎唯一获得一致行为的方法是添加数组中的第二个空元素......这对我来说感觉不对。 (见下面的代码)
function fn1 {
return @("asdf")
}
function fn2 {
return [array]@("asdf")
}
function fn3 {
return [System.Object[]]@("asdf")
}
function fn4 {
# This works but with the side effect of sending a null string that is not actually necessary
return @("asdf",$Null)
}
$v = fn1 # Same for fn2, fn3.
$v.GetType().Name # Expected: Object[], Actual: String
$v[0] # Expected: "asdf", Actual: "a"
$v = fn4
$v.GetType().Name # Expected: Object[], Actual: Object[]
$v[0] # Expected: "asdf", Actual: "asdf"
【问题讨论】:
-
问题不在于功能,而在于消费者; PowerShell 急切地解开集合。
[string[]] $v = fn1没有同样的问题。$v = @(fn1)也可以。 是可以使函数返回一个双重包装的数组 (,@("asdf")) 而无需更改调用者,但这实际上可能更令人困惑。