跳到主內容

無效的_null_感知_運算子

元素不能為空,因此 null 感知運算子 '?' 是不必要的。

Map Entry 的鍵不能為空,因此 null 感知運算子 '?' 是不必要的。

Map Entry 的值不能為空,因此 null 感知運算子 '?' 是不必要的。

由於短路機制,接收者不能為空 ('null'),因此不能使用 null 感知運算子 '{0}'。

接收者不能為空,因此 null 感知運算子 '{0}' 是不必要的。

描述

#

當 null 感知運算子 (?., ?.., ?[, ?..[, 或 ...?) 用於已知為不可為空的接收者時,分析器會產生此診斷訊息。

示例

#

以下程式碼會產生此診斷訊息,因為 s 不能為 null

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

以下程式碼會產生此診斷訊息,因為 a 不能為 null

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

以下程式碼會產生此診斷訊息,因為 s?.length 不能返回 null

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

s?.length 不能返回 null 的原因是,如果 snull,則跟在 s 後面的 null 感知運算子會短路 lengthisEven 的求值。換句話說,如果 snull,則 lengthisEven 都不會被呼叫;如果 s 不為 null,則 length 不能返回 null 值。無論哪種情況,isEven 都不能在 null 值上呼叫,因此 null 感知運算子是不必要的。有關更多詳細資訊,請參閱理解空安全

以下程式碼會產生此診斷訊息,因為 s 不能為 null

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

儘管 o 可以為 null,但 s 不能為 null 的原因是將其強制轉換為 String,這是一種不可為空的型別。如果 o 的值為 null,則強制轉換將失敗,並且不會呼叫 length

以下程式碼會產生此診斷訊息,因為 s 不能為 null

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

常見修復方法

#

將 null 感知運算子替換為非 null 感知等效項;例如,將 ?. 更改為 .

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

(請注意,返回型別也被更改為不可為空,這在某些情況下可能不適用。)