2013-07-19 7 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はヌルにそれを「アンラップ」になり、そう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 (G)} -PSHost 

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

を限り、私は(を理解し)、それはPowerShellの機能になると、オブジェクトを返す前に、次の

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は実際には正しいですが、大カッコ内に関数の引数を入れてはいけません。しかし、なぜ説明できないのですか。年齢のデザインや括弧は特別なことをします。 Fを文字列として扱うには、引用符で囲む必要があります。したがって、Fはオブジェクトであり、 "F"は文字列です。 –

0

を生成する前に、 「返品」は、機能を早期に終了するものです。

私はブルースPの著書「PowerShellのアクションで」ページ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

関連する問題