无效的_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;
}
(请注意,返回类型也被更改为不可为空,这在某些情况下可能不适用。)