Dart 理解int之间的差异?和int(或num?和num)

Dart 理解int之间的差异?和int(或num?和num),dart,Dart,定义地图后(以字母为键,以拼字图分数为值) Map letterScore//我省略了声明的其余部分 当我尝试此函数时(在DartPad中) int分数(字符串aWord){ int结果=0; 对于(int i=0;i

定义地图后(以字母为键,以拼字图分数为值)

Map letterScore//我省略了声明的其余部分
当我尝试此函数时(在DartPad中)

int分数(字符串aWord){
int结果=0;
对于(int i=0;i
无论我是通过将变量声明为
num
还是
int
来进行实验,我始终会收到错误消息:

错误:“int”类型的值无法分配给类型为的变量 “num”是因为“int”是可为null的,而“num”不是[我是在将所有数值变量声明为int后得到的]

错误:“num”类型的值无法从具有 返回类型“int”

错误:“num”类型的值无法分配给类型为的变量 “num”是因为“num”可为空而“num”不可为空

我理解整数和浮点数(或双精度)之间的区别,我不理解的是
int
vs
int?
num
vs
num?
以及声明变量时使用的形式。我应该如何声明和使用
int
num
变量来避免这些错误?

举个例子:

int x; // x has value as null
int x = 0; // x is initialized as zero
上面的代码都是很好的可编译代码。但是如果您启用Dart的
空安全
功能(您应该启用),则会使上述代码的工作方式有所不同

int x; // compilation error: "The non-nullable variable must be assigned before can be used"
int x = 0; // No Error.
这是编译器所做的一项工作,它在编译期间警告您变量可以为null的任何地方。太棒了

但是,如果因为在编译时不知道值而必须将变量声明为null,会发生什么呢

int? x; // Compiles fine because it's a nullable variable
是一种告诉编译器希望此变量允许
null
的方法。然而,当你说一个变量可以是空的时,那么每次你使用这个变量时,编译器都会提醒你在使用它之前检查这个变量是否为空

因此,
的另一种用法是:

int? x;
print(x?.toString() ?? "0");
进一步阅读:

官方文件:


空感知运算符:

您的问题是
映射上的
[]
运算符返回一个可以为
Null
的值。原因是,如果您在
映射中请求不存在的内容,它将返回
null
。因此,在您的情况下,
letterScore
在使用
[]
运算符时将返回一个
int?
。因此,您需要在那里处理该情况
[]
返回
null
。或者您可以使用
letterScore[aWord[i]]
(请参阅
符号),这将强制分析器停止抱怨,并且应该只将该值视为不可为空。但是如果
[]
返回
null
,则会出现运行时异常。
int? x; // Compiles fine because it's a nullable variable
int? x;
print(x?.toString() ?? "0");