¿Por qué y cómo son diferentes estos dos valores $ nulos?
Aparentemente, en PowerShell (ver. 3) no todos$null
son iguales:
>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
Entonces, ¿cómo y por qué es$l_t2
diferente de$l_t3
? En particular, es$l_t2
De Verdad$null
¿o no? Tenga en cuenta que$l_t2
NO es una matriz vacía ($l_t1
es y$l_t1 -eq $null
no devuelve nada, como se esperaba), pero tampoco es realmente$null
, me gusta$l_t3
. En particular,$l_t2.count
devuelve 0 en lugar de un error y, además, agrega$l_t2
a$l_t
se comporta como agregar una matriz vacía, no como agregar$null
. Y porque$l_t2
de repente parece convertirse en "más$null
"cuando se pasa en la funciónaddToArray
como parámetro ???????
¿Alguien puede explicar este comportamiento o señalarme la documentación que lo explicaría?
Editar: La respuesta de PetSerAl a continuación es correcta.También encontré esta publicación stackOverflow sobre el mismo problema.
Información de la versión de Powershell:
>$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