Я наконец нашел время, чтобы понять, почему Visual Studio Code требует, чтобы я поместил $null
в левой части сравнения на равенство.
Обыгрывая это поведение, я обнаружил, что при сравнении массива, содержащего $null
элементы, с $null
с $null
с правой стороны, «ожидаемое неожиданное поведение» происходит с массивами, содержащими два или более $null
элементов, но не для массивов, содержащих один $null
элемент. . То есть if ($array -eq $null) { 'It equals $null!' }
выводит It equals $null!
, если $array
содержит несколько $null
элементов, но не, когда $array
содержит только один. Что такого в количестве $null
элементов, что вызывает это несоответствие?
Следующий тестовый код демонстрирует это поведение ...
function TestForNull($description, $value)
{
$comparisonResult = $value -eq $null;
$ifEntered = if ($value -eq $null) {
$true;
} else {
$false;
};
Write-Host -Object $description;
Write-Host -Object "`t`$comparisonResult.GetType(): $($comparisonResult.GetType())";
Write-Host -Object "`t`$comparisonResult.Length: $($comparisonResult.Length)";
for ($i = 0; $i -lt $comparisonResult.Length; $i++)
{
$item = $comparisonResult.GetValue($i);
$itemText = if ($null -eq $item) {
'(null)';
} else {
$item.ToString();
};
Write-Host -Object "`t`$comparisonResult[$i]: $itemText";
}
Write-Host -Object "`t`$ifEntered: $ifEntered";
}
TestForNull '0-element array' @();
TestForNull '1-element array with all $nulls' @($null);
TestForNull '2-element array with all $nulls' @($null, $null);
TestForNull '3-element array with all $nulls' @($null, $null, $null);
TestForNull '3-element array with one leading $null' @($null, 2, 3);
TestForNull '3-element array with one inner $null' @(1, $null, 3);
TestForNull '3-element array with one trailing $null' @(1, 2, $null);
TestForNull '3-element array with two leading $nulls' @($null, $null, 3);
TestForNull '3-element array with two boundary $nulls' @($null, 2, $null);
TestForNull '3-element array with two trailing $nulls' @(1, $null, $null);
... и выходы ...
0-element array
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 0
$ifEntered: False
1-element array with all $nulls
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 1
$comparisonResult[0]: (null)
$ifEntered: False
2-element array with all $nulls
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 2
$comparisonResult[0]: (null)
$comparisonResult[1]: (null)
$ifEntered: True
3-element array with all $nulls
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 3
$comparisonResult[0]: (null)
$comparisonResult[1]: (null)
$comparisonResult[2]: (null)
$ifEntered: True
3-element array with one leading $null
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 1
$comparisonResult[0]: (null)
$ifEntered: False
3-element array with one inner $null
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 1
$comparisonResult[0]: (null)
$ifEntered: False
3-element array with one trailing $null
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 1
$comparisonResult[0]: (null)
$ifEntered: False
3-element array with two leading $nulls
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 2
$comparisonResult[0]: (null)
$comparisonResult[1]: (null)
$ifEntered: True
3-element array with two boundary $nulls
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 2
$comparisonResult[0]: (null)
$comparisonResult[1]: (null)
$ifEntered: True
3-element array with two trailing $nulls
$comparisonResult.GetType(): System.Object[]
$comparisonResult.Length: 2
$comparisonResult[0]: (null)
$comparisonResult[1]: (null)
$ifEntered: True