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