跳到主内容

无效的_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;
}

(请注意,返回类型也被更改为不可为空,这在某些情况下可能不适用。)