PossibleIncorrectComparisonWithNull

重大度レベル: 警告

デフォルト状態:常に有効

形容

このルールは、比較演算子の左側に $null がない比較を検出します。 PowerShell で比較が正しく実行されるようにするには、$null 要素を演算子の左側に配置する必要があります。

この配置が重要な理由は複数あります。

  • $null はスカラー値です。 演算子の左側の値がスカラーの場合、比較演算子はブール 値 返します。 値がコレクションの場合、比較演算子は一致する値を返すか、コレクションに一致がなければ空の配列を返します。
  • PowerShell は、右側のオペランドに対して型キャストを実行します。その結果、$null が他のスカラー型にキャストされるときに、正しくない比較が行われます。

値が $null かどうかを確実に確認する唯一の方法は、スカラー比較が実行されるように演算子の左側に $null を配置することです。

比較演算子の挙動

比較演算子は設計上、次のように動作します。

# This example returns 'false' because the comparison doesn't 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' }

この挙動は、特にヌルチェックを行う意図がある場合、予期せぬ結果を生むことがあります。

以下の例は、左側が集合である場合に比較演算子がどのように振る舞うかを示しています。 演算子はコレクション内の各要素を右側の値と比較し、コレクションから一致する要素のみを返します。

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

例

非準拠

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

対応

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

ルールの設定

このルールは常に有効で、設定はできません。 このルールを避けるために、以下のいずれかの方法を用いてください。

  • 欲しいルールだけを含めるか、不要なルールを除外するカスタムルール設定ファイルを作成しましょう。
  • 特定のコードブロックに対してルール抑制を抑制するために、適切なルール抑制属性をコードに追加してください。 詳細については、PSScriptAnalyzerの使用に関する「抑制ルール」セクションをご覧ください。