無效的_null_感知_運算子
元素不能為空,因此 null 感知運算子 '?' 是不必要的。
Map Entry 的鍵不能為空,因此 null 感知運算子 '?' 是不必要的。
Map Entry 的值不能為空,因此 null 感知運算子 '?' 是不必要的。
由於短路機制,接收者不能為空 ('null'),因此不能使用 null 感知運算子 '{0}'。
接收者不能為空,因此 null 感知運算子 '{0}' 是不必要的。
描述
#當 null 感知運算子 (?., ?.., ?[, ?..[, 或 ...?) 用於已知為不可為空的接收者時,分析器會產生此診斷訊息。
示例
#以下程式碼會產生此診斷訊息,因為 s 不能為 null
int? getLength(String s) {
return s?.length;
}以下程式碼會產生此診斷訊息,因為 a 不能為 null
var a = [];
var b = [...?a];以下程式碼會產生此診斷訊息,因為 s?.length 不能返回 null
void f(String? s) {
s?.length?.isEven;
}s?.length 不能返回 null 的原因是,如果 s 為 null,則跟在 s 後面的 null 感知運算子會短路 length 和 isEven 的求值。換句話說,如果 s 為 null,則 length 和 isEven 都不會被呼叫;如果 s 不為 null,則 length 不能返回 null 值。無論哪種情況,isEven 都不能在 null 值上呼叫,因此 null 感知運算子是不必要的。有關更多詳細資訊,請參閱理解空安全。
以下程式碼會產生此診斷訊息,因為 s 不能為 null。
void f(Object? o) {
var s = o as String;
s?.length;
}儘管 o 可以為 null,但 s 不能為 null 的原因是將其強制轉換為 String,這是一種不可為空的型別。如果 o 的值為 null,則強制轉換將失敗,並且不會呼叫 length。
以下程式碼會產生此診斷訊息,因為 s 不能為 null
List<String> makeSingletonList(String s) {
return <String>[?s];
}常見修復方法
#將 null 感知運算子替換為非 null 感知等效項;例如,將 ?. 更改為 .
int getLength(String s) {
return s.length;
}(請注意,返回型別也被更改為不可為空,這在某些情況下可能不適用。)