Udostępnij za pomocą


PossibleIncorrectComparisonWithNull

poziom ważności: ostrzeżenie

Opis

Aby upewnić się, że program PowerShell prawidłowo wykonuje porównania, element $null powinien znajdować się po lewej stronie operatora.

Istnieje wiele powodów, dla których taka sytuacja występuje:

  • $null jest wartością skalarną. Gdy wartość po lewej stronie operatora jest skalarną, operatory porównania zwracają wartość wartości logicznej. Gdy wartość jest kolekcją, operatory porównania zwracają wszystkie pasujące wartości lub pustą tablicę, jeśli w kolekcji nie ma dopasowań.
  • Program PowerShell wykonuje rzutowanie typu na operand po prawej stronie, co powoduje nieprawidłowe porównania, gdy $null jest rzutowy na inne typy skalarne.

Jedynym sposobem niezawodnego sprawdzenia, czy wartość jest $null, jest umieszczenie $null po lewej stronie operatora, aby wykonać porównanie skalarne.

Jak

Przenieś $null z lewej strony porównania.

Przykład

Błędny

function Test-CompareWithNull
{
    if ($DebugPreference -eq $null)
    {
    }
}

Poprawny

function Test-CompareWithNull
{
    if ($null -eq $DebugPreference)
    {
    }
}

Wypróbuj to samodzielnie

# This example returns 'false' because the comparison does not return any objects from the array
if (@() -eq $null) { 'true' } else { 'false' }
# This example returns 'true' because the array is empty
if ($null -ne @()) { 'true' } else { 'false' }

W ten sposób operator porównania działa zgodnie z projektem. Jednak, jak pokazano, może to prowadzić do nieu intuicyjnego zachowania, zwłaszcza gdy intencja jest prostym testem wartości null.

W poniższym przykładzie pokazano zaprojektowane zachowanie operatora porównania, gdy lewa strona jest kolekcją. Każdy element w kolekcji jest porównywany z wartością po prawej stronie. Gdy wartość true, zwracany jest ten element kolekcji.

PS> 1,2,3,1,2 -eq $null
PS> 1,2,3,1,2 -eq 1
1
1
PS> (1,2,3,1,2 -eq $null).count
0
PS> (1,2,$null,3,$null,1,2 -eq $null).count
2