gpt4 book ai didi

dart - "The argument type ' 字符串? ' can' t 分配给参数类型 'String' "使用 stdin.readLineSync() 时

转载 作者:行者123 更新时间:2023-12-04 11:54:58 25 4
gpt4 key购买 nike

我是 Dart 新手。我不知道我犯了什么样的错误,但是这段代码不起作用。
是一个简单的代码,只需在终端中读取年龄并说它是未成年人或超过 18 岁。

import 'dart:io'; 

main(){
print("Entre com a sua idade: ");
var input = stdin.readLineSync();
var idade = int.parse(input);

if(idade >= 18){
print("É maior de idade");
}else{
print("É menor de idade");
}
}
我得到这个错误:
algoritmo01.dart:15:25: 错误:参数类型“字符串?”不能分配给参数类型 'String',因为 'String?'可以为空,而 'String' 不是。
var idade = int.parse(input);

最佳答案

欢迎使用 Dart 。您所体验的是新的 null 安全功能(随 Dart 2.12.0 引入),默认情况下变量不能包含值 null。这是静态检查的,因此即使在执行程序之前您也会收到错误。
在您的示例中,问题是以下行:

var input = stdin.readLineSync();
如果我们查看手册,我们可以看到此方法具有以下签名:
String? readLineSync (
{Encoding encoding = systemEncoding,
bool retainNewlines = false}
)
https://api.dart.dev/stable/2.12.2/dart-io/Stdin/readLineSync.html String?意味着它是可空类型,因此允许包含任何字符串或空值。如果类型改为 String这意味着结果只能是 String从不 null .
这意味着您的变量 input现在有类型 String? .如果您查看示例的第二行,这(在 2.12.0 中引入)是一个问题:
var idade = int.parse(input);
自签名 int.parse是:
int parse (

String source,
{int? radix,
@deprecated int onError(
String source
)}

)
https://api.dart.dev/stable/2.12.2/dart-core/int/parse.html
其中需要一个 String (因此永远不可能是 null )。因此,您不能提供您的 String?作为仅处理 String 的方法的参数.相反的情况是允许的(如果方法需要 String? 并且你给它一个 String )。
那么对于这种情况我们能做些什么呢?那么,你需要处理 null的情况或者告诉 Dart 如果 input 它应该只是让你的程序崩溃是 null .
所以你可以像这样处理它:
import 'dart:io';

void main() {
print("Entre com a sua idade: ");
var input = stdin.readLineSync();

if (input != null) {
var idade = int.parse(input);

if (idade >= 18) {
print("É maior de idade");
} else {
print("É menor de idade");
}
} else {
print('Input was null!');
}
}
如您所见,即使 input 也是允许的技术上仍然属于 String? 类型.但是 Dart 可以看到您的 if声明将阻止 input具有值 null所以它会被“提升”到 String只要你在这个 if 语句中。
另一个解决方案是告诉 Dart 它应该停止提示关于 input 的静态错误。并假设 inputString编译代码时:
import 'dart:io';

void main() {
print("Entre com a sua idade: ");
var input = stdin.readLineSync()!;
var idade = int.parse(input);

if (idade >= 18) {
print("É maior de idade");
} else {
print("É menor de idade");
}
}
(变化是 ! 添加在 readLineSync() 之后)
在这种情况下,Dart 将改为添加自己的 null -如果 stdin.readLineSync,检查并崩溃程序确实给出了 null值(value)。这是为了确保我们永远不会放弃 int.parse一个空值,它可能会使您的代码在其他地方崩溃。通过添加 null -检查我们在哪里得到有问题的值,我们可以确保我们快速失败并且在事情不像我们预期的那样的地方失败。
你可以在这里阅读更多关于 Dart 中的 null-safety(也由 Stephen 链接): https://dart.dev/null-safety/understanding-null-safety

关于dart - "The argument type ' 字符串? ' can' t 分配给参数类型 'String' "使用 stdin.readLineSync() 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66695339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com