2014-12-11 10 views
5

W mojej niekończącej się pogoni zrozumieć PowerShell lepiej może ktoś proszę wyjaśnić to zachowanie do mnie:Dlaczego mogę zadzwonić GetType() na pustą tablicę, ale nie wtedy, gdy jego powrocie z funkcji

function fn1{return @()} 
(@()).GetType()   #does not throw an error 
(fn1).GetType()   #throws error "You cannot call a method on a null-valued expression." 

Dlaczego zwracanie wartości z funkcji powoduje, że jest "inna"?

ciekawe (a może nie), orurowanie do get-member wykazuje takie samo zachowanie w obu przypadkach:

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." 

Kolor mnie zmieszany. Czy ktoś może to wyjaśnić?

+0

możliwy duplikat [PowerShell nie zwraca pustej tablicy jako tablicy] (http://stackoverflow.com/questions/18476634/powershell-doesnt-return-an-empty-array-as-an-array) – arco444

Odpowiedz

4

Dzieje się tak, ponieważ po zwróceniu tablicy (i prawdopodobnie innej kolekcji) z funkcji, PowerShell umieści każdy element tablicy w potoku. Tak więc GetType() faktycznie nie jest wywoływany w pustej tablicy, ale jest to element (którego brakuje).

Dusza może przywrócić tablicę w innej tablicy :).

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

Teraz PowerShell przejdzie do elementów rurociągów tej „nadrzędnej” tablicy, która dzieje containt tylko jeden element: Twój pustą tablicę. Należy pamiętać, że nie można tego osiągnąć przez return @(@()), ponieważ zewnętrzny @() zapewnia jedynie, że wynikiem zwróconym będzie tablica, którą już jest.

+0

Nadal nie jestem pewien, czy rozumiem rozumowanie, ale Twoje proponowane rozwiązanie działa. Wielkie dzięki Adam. – jamiet

Powiązane problemy