Warum und wie unterscheiden sich diese beiden $ null-Werte?

Anscheinend sind in PowerShell (Version 3) nicht alle$null 's sind die gleichen:

    >function emptyArray() { @() }
    >$l_t = @() ; $l_t.Count
0
    >$l_t1 = @(); $l_t1 -eq $null; $l_t1.count; $l_t1.gettype()
0
IsPublic IsSerial Name                                     BaseType                                                         
-------- -------- ----                                     --------                                                         
True     True     Object[]                                 System.Array                                                     
    >$l_t += $l_t1; $l_t.Count
0
    >$l_t += emptyArray; $l_t.Count
0
    >$l_t2 = emptyArray; $l_t2 -eq $null; $l_t2.Count; $l_t2.gettype()
True
0
You cannot call a method on a null-valued expression.
At line:1 char:38
+ $l_t2 = emptyArray; $l_t2 -eq $null; $l_t2.Count; $l_t2.gettype()
+                                      ~~~~~~~~~~~~~~~
  + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
  + FullyQualifiedErrorId : InvokeMethodOnNull
    >$l_t += $l_t2; $l_t.Count
0
    >$l_t3 = $null; $l_t3 -eq $null;$l_t3.gettype()
True
You cannot call a method on a null-valued expression.
At line:1 char:32
+ $l_t3 = $null; $l_t3 -eq $null;$l_t3.gettype()
+                                ~~~~~~~~~~~~~~~
  + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
  + FullyQualifiedErrorId : InvokeMethodOnNull
    >$l_t += $l_t3; $l_t.count
1
    >function addToArray($l_a, $l_b) { $l_a += $l_b; $l_a.count }
    >$l_t = @(); $l_t.Count
0
    >addToArray $l_t $l_t1
0
    >addToArray $l_t $l_t2
1

So wie und warum ist$l_t2 anders als$l_t3? Insbesondere ist$l_t2 Ja wirklich$null oder nicht? Beachten Sie, dass$l_t2 ist KEIN leeres Array $l_t1 ist und$l_t1 -eq $null gibt erwartungsgemäß nichts zurück, aber es ist auch nicht wirklich$null, mögen$l_t3. Im Speziellen,$l_t2.count gibt 0 statt eines Fehlers zurück und fügt außerdem @ hin$l_t2 zu$l_t verhält sich wie das Hinzufügen eines leeren Arrays, nicht wie das Hinzufügen von$null. Und warum macht$l_t2 scheinen plötzlich "mehr @ zu werd$null "wenn es in der Funktion @ übergeben wiaddToArray als Parameter ???????

Kann jemand dieses Verhalten erklären oder mich auf eine Dokumentation verweisen, die es erklären würde?

Bearbeiten: Die Antwort von PetSerAl unten ist richtig.Ich habe auch diesen stackOverflow-Beitrag zum selben Thema gefunden.

Powershell Versionsinfo:

    >$PSVersionTable
Name                           Value                                                                                        
----                           -----                                                                                        
WSManStackVersion              3.0                                                                                          
PSCompatibleVersions           {1.0, 2.0, 3.0}                                                                              
SerializationVersion           1.1.0.1                                                                                      
BuildVersion                   6.2.9200.16481                                                                               
PSVersion                      3.0                                                                                          
CLRVersion                     4.0.30319.1026                                                                               
PSRemotingProtocolVersion      2.2                                                                                          

Antworten auf die Frage(6)

Ihre Antwort auf die Frage