2013-07-19 5 views
5

Warum gibt es einen Unterschied in den Rückgabewerten von F und G in dem folgenden Code?das Ergebnis eines Funktionsaufruf zurückkehrend mit/ohne Klammer

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] 

Soweit ich verstehe, wenn eine Funktion eine Art leerer Auflistung zurückgibt, wird Powershell „auspacken“ es in null, und so F tut, was ich erwarte. Aber was ist mit G los?

Edit: Wie von JPBlanc hingewiesen, zeigt nur PowerShell 3.0 diesen Unterschied. In 2.0, drucken Sie beiden Linien null. Was hat sich geändert?

Antwort

3

Entschuldigung, ich lese Ihre Frage nicht richtig, da F eine Funktion ist, die Sie verwenden(), um die Funktion zu bewerten. So dann das Ergebnis Write-Type Funktion ist für mich in Powershell V2.0.

Also, in PowerShell 3.0 Ich treffe dein Problem.

Jetzt mit:

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

Versus

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

soweit ich das() vor vor der Rückkehr Objekt erzeugen die folgende

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

Könnten Sie bitte erklären? –

+0

Ich glaube nicht, dass das richtig ist. In 'Write-Type F' wird das' F' als die Saite '" F "interpretiert, was nicht das ist, was ich will. – ahihi

+0

nicht genau, @JPBlanc hat eigentlich recht, du solltest keine Funktionsargumente in Klammern setzen, aber ich konnte keine Erklärung dafür finden Alter Design oder Klammern macht etwas Besonderes. Damit F als String behandelt wird, müssten Sie es mit Anführungszeichen umgeben. Also ist F ein Objekt und "F" ist eine Zeichenkette. –

0

verstehen Wenn es um die Powershell-Funktion kommt Was "return" macht, ist früh aus der Funktion heraus.

I Bruce P Buch „Powershell in Aktion“ Seite 262, überprüft es sagt:

„Warum also braucht Powershell eine return-Anweisung Die Antwort ist, die Flusssteuerung Manchmal wollen Sie verlassen?. . früh eine Funktion Ohne eine return-Anweisung, dann würden Sie komplexe bedingte Anweisungen schreiben müssen, um die Flusssteuerung zu bekommen, das Ende zu erreichen ...“

auch Keith Hill hat einen sehr guten Blog darüber zu reden: http://rkeithhill.wordpress.com/2007/09/16/effective-powershell-item-7-understanding-output/

"......" return $ Proc "bedeutet nicht bedeuten, dass die Funktionen nur Ausgabe der Inhalt der $ Proc-Variable ist. Tatsächlich ist dieses Konstrukt semantisch äquivalent zu "$ Proc; return". .....“

auf dieser Basis, wenn Sie Ihre Funktion Code wie folgt ändern, sind die Skript-Ausgabe gleich:

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

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

Dieses Verhalten als herkömmliche Sprache anders ist, so dass es einige Verwirrungen verursacht .

+1

Wie in meinem Kommentar zu C. B. Antwort erwähnt, ist das Problem nicht mit dem 'return' Schlüsselwort. Es ist ein Problem, das anscheinend mit PowerShell v3 eingeführt wurde. –

+0

Danke Ansgar. Ich habe den versteckten Kommentar nicht gesehen, als ich das gepostet habe. – Peter

Verwandte Themen