错误地分配自定义类型的变量不会在静态类型检查中产生错误
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){}
知道如何处理所有那些非空 String
s 除了 到 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){}
.
就不能这样做了
我正在分配类型为 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){}
知道如何处理所有那些非空 String
s 除了 到 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){}
.