为什么我可以在空数组上调用GetType(),而不是从函数返回时调用

时间:2014-12-11 11:03:57

标签: powershell

在我不断追求更好地理解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."

让我感到困惑。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:4)

这是因为当您从函数返回一个数组(可能还有任何其他集合)时,PowerShell会将数组的每个元素放入一个管道中。所以GetType()实际上并没有在空数组上调用,而是它的元素(缺少)。

可以在另一个数组中返回你的数组:)。

function fn1{return ,@()}
(fn1).GetType() 

现在,Powershell将传递给这个“父”数组的管道元素,这恰好只包含一个元素:空数组。 请注意,您无法通过return @(@())实现这一目标,因为外部@()仅确保返回的结果将是一个已经存在的数组。