0

我在运行 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!");
}
4

1 回答 1

0

正如您在 的文档中所读到的num.tryParse,该方法的返回类型为num?. 这意味着您的变量n也是类型num?(Nullable num)。

因此,错误会将您指向要从 中减去可为空数的行DateTime.now().year,这是不允许的。

您可以通过使用??(Null coalescing) 运算符并检查 null 以及是否n减去null0 来解决此限制。

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 之后并且工作正常......这是相同的解决方案吗?

空断言运算符( !) 添加到ninDateTime.now().year - n!不是相同的解决方案,但它是一种可能的解决方案。正如您已经提到的那样,它可以编译并工作。

但要小心: 你告诉编译器你确定,那n永远不会为空。

使用您当前的代码,当用户输入字母或不输入任何内容时,您将收到运行时错误。然后该字符串的解析失败并且您的n为空。现在你想从 中减去nullDateTime.now().year这也是不允许的。

您可以在https://dart.dev/codelabs/null-safety上阅读有关 Null-Safety 的更多信息。


边注:

以下检查不正确:

if(n=="") {
    print("Bad Year");
}

如果输入了不正确的数字,则您的nisnull和 this 不等于空字符串。要使您的 if 子句起作用,只需使用空检查。我还建议return在输出后添加一个,否则你的人会变老。

if(n == null) {
    print("Bad Year");
    return;
}
于 2021-06-19T12:13:10.373 回答