在我不断追求更好地理解Powershell的过程中,有人可以向我解释这种行为:
function fn1{return @()}
(@()).GetType() #does not throw an error
(fn1).GetType() #throws error "You cannot call a method on a null-valued expression."
为什么从函数返回一个值会使它变得不同?#34;?
有趣的是(或许不是),get-member的管道在两种情况下表现出相同的行为:
function fn1{return @()}
@() | gm #does throw an error "You cannot call a method on a null-valued expression."
fn1 | gm #does throw an error "You cannot call a method on a null-valued expression."
让我感到困惑。有人可以解释一下吗?
答案 0 :(得分:4)
这是因为当您从函数返回一个数组(可能还有任何其他集合)时,PowerShell会将数组的每个元素放入一个管道中。所以GetType()
实际上并没有在空数组上调用,而是它的元素(缺少)。
可以在另一个数组中返回你的数组:)。
function fn1{return ,@()}
(fn1).GetType()
现在,Powershell将传递给这个“父”数组的管道元素,这恰好只包含一个元素:空数组。
请注意,您无法通过return @(@())
实现这一目标,因为外部@()
仅确保返回的结果将是一个已经存在的数组。