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