错误地分配自定义类型的变量不会在静态类型检查中产生错误

Incorrectly assigning a variable of custom type does not give an error in static type check

我正在分配类型为 Function(String) 的变量 stringFn,例如:

Function(String) stringFn = (String? s) {};

即使 stringFn 被分配了一个可以接收可为空参数的函数,dart 静态类型检查也不会给出错误。

打印 stringFn 的运行时类型会导致 (String?) => Null 但如果我调用该函数:

stringFn(null);

结果 The argument type 'Null' can't be assigned to the parameter type 'String' 我同意,因为该类型不允许可空参数。

我是不是漏掉了什么?

这是有意为之的行为。 String? 可以被认为是比 String 更多 的泛型类型,因为它可以接受所有 String null.

因此,任何传递给 Function(String)String 都可以保证由您的 (String? s){} 正确处理。 stringFn 声称它可以根据其变量类型处理所有非空 String 值。 (String? s){} 知道如何处理所有那些非空 Strings 除了 null,所以代码是有效的。

您会看到,如果您尝试将 null 传递给 stringFn,您应该得到一个 静态分析错误,而不是运行时:

void main() {
  Function(String) stringFn = (String? s) {};
  
  stringFn(null);//The argument type 'Null' can't be assigned to the parameter type 'String'
}

尝试反向操作(翻转类型和赋值)将在 stringFn 行显示静态分析错误:

void main() {
  Function(String?) stringFn = (String s) {};//The argument type 'Null Function(String)' can't be assigned to the parameter type 'dynamic Function(String?)'
  
  stringFn(null);
}

这再次符合预期,因为您的参数 (String s){} 不知道如何处理可空类型,因为您的变量类型暗示它应该这样做。根据 stringFn 的类型,null 应该被正确处理,但是 (String s){}.

就不能这样做了