错误:“num?”类型的值不能分配给类型为 'num' 的变量,因为 'num?

时间:2021-06-19 11:57:29

标签: flutter dart

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

1 个答案:

答案 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");
}

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

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