メインコンテンツにスキップ

無効なnull許容演算子

要素は null にできないため、null 許容演算子 `?` は不要です。

マップエントリのキーは null にできないため、null 許容演算子 `?` は不要です。

マップエントリの値は null にできないため、null 許容演算子 `?` は不要です。

短絡評価のため、レシーバーは `null` になり得ないため、null 許容演算子 `{0}` は使用できません。

レシーバーは null にできないため、null 許容演算子 `{0}` は不要です。

説明

#

null 非許容であることがわかっているレシーバーに対して null 許容演算子 (`?.`、`?..`、`?[`、`?..[`、または `...?`) が使用された場合に、アナライザーはこの診断を生成します。

#

snull になり得ないため、次のコードはこの診断を生成します。

dart
int? getLength(String s) {
  return s?.length;
}

anull になり得ないため、次のコードはこの診断を生成します。

dart
var a = [];
var b = [...?a];

s?.lengthnull を返せないため、次のコードはこの診断を生成します。

dart
void f(String? s) {
  s?.length?.isEven;
}

s?.lengthnull を返せない理由は、`s` の後の null 許容演算子が、`s` が null の場合に `length` と `isEven` の両方の評価を短絡させるためです。つまり、`s` が null の場合、`length` も `isEven` も呼び出されず、`s` が null でない場合、`length` は null 値を返せません。いずれにせよ、`isEven` は null 値で呼び出すことはできないため、null 許容演算子は不要です。詳細については、「Null Safety の理解」を参照してください。

snull になり得ないため、次のコードはこの診断を生成します。

dart
void f(Object? o) {
  var s = o as String;
  s?.length;
}

onull になり得ますが、`s` が null になり得ない理由は、null 非許容型である String へのキャストによるものです。o の値が null になった場合、キャストは失敗し、`length` の呼び出しは行われません。

snull になり得ないため、次のコードはこの診断を生成します。

dart
List<String> makeSingletonList(String s) {
  return <String>[?s];
}

一般的な修正

#

null 許容演算子を null 非許容の同等物に置き換えてください。たとえば、?.. に変更します。

dart
int getLength(String s) {
  return s.length;
}

(戻り値の型も null 非許容に変更されたことに注意してください。これは場合によっては適切でない可能性があります。)