错误:未为类“Object”定义运算符“+”

时间:2021-04-19 08:46:57

标签: dictionary dart

作为一个来自 python 和 javascript 的完整 Dart 初学者,我发现这种行为很奇怪:

var user = {'name': 'John Doe', 'birth_y': 1980};
2021-user['birth_y'] // is 41

但是如果操作员在右边。

user['birth_y'] + 41 // error

错误:

Error: The operator '+' isn't defined for the class 'Object'.
- 'Object' is from 'dart:core'.
Try correcting the operator to an existing operator, or defining a '+' operator.
  user['birth_y'] + 41;
                  ^

从错误中,有人猜测对于混合类型的映射,条目具有类型“对象”,然而:

user['birth_y'] is int // true
user['birth_y'].runtimeType // int

这种行为也表现在混合类型的列表中, 我错过了什么?

1 个答案:

答案 0 :(得分:1)

Dart 在运行之前会对您的程序进行静态分析。在这个分析阶段,它会查看变量的数据类型,看看它是否是静态安全的。

就您而言,您有这个 Map

var user = {'name': 'John Doe', 'birth_y': 1980};

由于您的 Map 包含不同类型的值,Dart 将尝试查看可用于所有值的数据类型。在这种情况下,Stringint 唯一共享的是 Object 类型。因此 user 被分析为 Map<String, Object> 类型。

这意味着当您从 user 获取对象时,分析器唯一可以确定的是它的类型为 Object

所以当你这样做时:

user['birth_y'] + 41

分析器会假设您得到一个没有 Object 运算符的 +

您通常不应将 Map 用作某种包含不同数据类型的对象。而是创建一个 class,它可以编写类型安全的代码。