2013-07-19 4 views
5

다음 코드에서 F와 G의 반환 값에 차이가있는 이유는 무엇입니까? 함수가 빈 콜렉션의 어떤 종류를 반환하는 경우괄호 사용/사용 안 함 결과 반환

Function F { 
    Return (New-Object Collections.Generic.LinkedList[Object]) 
} 

Function G { 
    Return New-Object Collections.Generic.LinkedList[Object] 
} 

Function Write-Type($x) { 
    If($null -eq $x) { 
     Write-Host "null" 
    } Else { 
     Write-Host $x.GetType() 
    } 
} 

Write-Type (F) # -> null 
Write-Type (G) # -> System.Collections.Generic.LinkedList`1[System.Object] 

는 지금까지 내가 이해, PowerShell은 널 (null)로 "를 풀다"할 것이다, 그래서 F 내가 기대한다. 하지만 G는 어떻게됩니까?

편집 : JPBlanc에서 지적했듯이 PowerShell 3.0만이이 차이점을 나타냅니다. 2.0에서는 두 줄 모두 null을 인쇄합니다. 무엇이 바뀌 었습니까?

답변

3

죄송합니다. 귀하의 질문을 정확하게 읽지 않습니다. F는()을 사용하여 함수를 평가하는 함수입니다. 그렇다면 Write-Type 함수의 결과는 PowerShell V2.0에서 나와 동일합니다.

그래서 PowerShell 3.0에서 나는 당신의 문제를 만난다.

지금 사용 :

Trace-Command -name TypeConversion -Expression {Write-Type (F)} -PSHost 

까지 내가 이해

Trace-Command -name TypeConversion -Expression {Write-Type (G)} -PSHost 

수스 전에 파워 쉘 기능에 올 때 개체가 다음

Converting "Collections.Generic.LinkedList" to "System.Type". 
    Conversion to System.Type 
     Conversion to System.Type 
      Could not find a match for "System.Collections.Generic.LinkedList". 
     Could not find a match for "Collections.Generic.LinkedList". 
Converting "Collections.Generic.LinkedList`1" to "System.Type". 
    Conversion to System.Type 
     Conversion to System.Type 
      Found "System.Collections.Generic.LinkedList`1[T]" in the loaded assemblies. 
Converting "Object" to "System.Type". 
    Conversion to System.Type 
     Conversion to System.Type 
      Found "System.Object" in the loaded assemblies. 
+0

설명해 주시겠습니까? –

+0

'Write-Type F'에서'F'는''F "'로 해석 될 것입니다. 이것은 내가 원하지 않는 것입니다. – ahihi

+0

정확히, @ JPBlanc 실제로 맞습니다, 당신은 대괄호 안에 함수 인수를 넣으면 안됩니다. 그러나 설명을 찾을 수 없습니다. 왜 그냥이 langu 연령 디자인이나 괄호는 특별한 것을합니다. F를 문자열로 처리하려면 따옴표로 묶어야합니다. 그래서 F는 객체이고 "F"는 문자열입니다. –

0

생성 돌아 오기 전에() "복귀"가하는 일은 기능을 조기에 빠져 나가는 것입니다.

내가 브루스 P의 책 "행동 파워 쉘"262 페이지를 확인, 그것은 말한다 :

"왜, 다음, PowerShell은 return 문을 필요합니까 대답은, 흐름 제어 때로는 종료하고자한다?. . 함수는 초기 return 문이 없다면, 당신은 ... "마지막에 도달하는 흐름 제어를 얻기 위해 복잡한 조건 문을 작성해야 할 것

또한 키스 힐이 얘기 아주 좋은 블로그가 있습니다 http://rkeithhill.wordpress.com/2007/09/16/effective-powershell-item-7-understanding-output/

"......"return $ Proc "가 이 아니면은 함수 만 출력하는 것이 $ Proc 변수의 내용임을 의미합니다. 사실이 구조는 의미 론적으로 "$ Proc; return"과 같습니다. 이 같은 함수 코드를 변경하면 ..... "이를 바탕으로

, 스크립트 출력은 동일합니다 : 그것은 약간의 혼란을 야기하므로

Function F { 
    (New-Object Collections.Generic.LinkedList[Object]) 
    Return 
} 

Function G { 
    New-Object Collections.Generic.LinkedList[Object] 
    Return 
} 

이 문제는 기존의 언어와 다른

+1

C.B.의 대답에 대한 나의 의견에서 언급했듯이이 문제는'return' 키워드와 관련이 없습니다. PowerShell v3에서 소개 된 문제입니다. –

+0

감사합니다. Ansgar. 나는 이것을 게시 할 때 숨겨진 코멘트를 보지 못했습니다. – Peter