我在运行 dart 项目时发现了这个错误
<块引用>错误:'num?' 类型的值不能分配给类型为 'num' 的变量,因为 'num?'
import 'dart:io';
void main() {
print("Enter your birth-year");
var n = num.tryParse(stdin.readLineSync() ?? "");
if(n=="") {
print("Bad Year");
}
var age = DateTime.now().year-n;
print(" ==> You are $age year old!");
}
答案 0 :(得分:0)
正如您在 num.tryParse
的文档中所读到的,该方法的返回类型为 num?
。这意味着您的变量 n
的类型也是 num?
(Nullable num)。
因此错误将您指向要从 DateTime.now().year
中减去可为空的数字的行,这是不允许的。
您可以通过使用 ??
(空合并)运算符并检查是否为空以及您的 n
是否为 null
减去 0 来解决此限制。
var age = DateTime.now().year - (n ?? 0) ;
另一种解决方案是,只使用 if
检查 null 后跟一个 else
块,例如:
if(n == null) {
print("Bad Year");
}
else {
var age = DateTime.now(). year - n ;
print(" ==> You are $age year old!");
}
接受您的评论:
<块引用>我加了!在 n 之后工作正常......这是相同的解决方案吗?
将空断言运算符 (!
) 添加到 n
中的 DateTime.now().year - n!
不是同一个解决方案,但它是一个可能的解决方案。正如您已经提到的,它可以编译并运行。
但要小心:
您告诉编译器您确定,n
永远不会为空。
使用您当前的代码,当用户输入字母或什么都不输入时,您将收到运行时错误。然后该字符串的解析失败并且您的 n
为空。现在您想从 null
中减去 DateTime.now().year
,这也是不允许的。
您可以在 https://dart.dev/codelabs/null-safety.
上阅读有关 Null-Safety 的更多信息附注:
以下检查不正确:
if(n=="") {
print("Bad Year");
}
如果输入的数字不正确,则您的 n
为 null
,这不等于空字符串。要使您的 if 子句起作用,只需使用空检查即可。我还建议在输出后添加 return
,否则您的人会变老。
if(n == null) {
print("Bad Year");
return;
}