为什么当我明确说类型是 double 时 dart 将变量类型推断为 int?
Why dart infers the variable type as a int when I explicitly say the type is double?
这是来自 doc
的示例
医生说
必要时整数文字会自动转换为双精度数:
double z = 1; // Equivalent to double z = 1.0.
但是当我检查 runtimeType
时,类型是 int
print(z.runtimeType); // prints to int
我猜您正在使用 dartpad.dev 进行测试或将您的代码编译为 JavaScript。在 JavaScript 中,int
和 double
没有单独的类型,所以当使用 runtimeType
时,Dart 只是根据 JavaScript 以来的当前值猜测类型] 在内部将所有数字表示为 double
。
但是如果我们在Dart VM中运行或者编译为本地代码,我们可以确定类型。所以你的例子将 return double
作为 z
的类型 if 运行 Dart VM.
void main(List<String> args) {
print(1.1.runtimeType); // dartpad: double, dartvm: double
print(1.0.runtimeType); // dartpad: int, dartvm: double
print(1.runtimeType); // dartpad: int, dartvm: int
}
另请参阅 Dart 文档中有关 int
类型在编译为 JavaScript 时的不同行为的注释:
https://api.dart.dev/stable/2.12.3/dart-core/int-class.html
此处显示了一个更详细的示例,其中我们可以看到 double
声明的变量在 运行 DartVM 中的 Dart 代码与编译时的行为有何不同 JavaScript:
void main(List<String> args) {
print('| toString | runtimeType | is int | is double |');
for (double i = 0; i <= 2; i += 0.5) {
print('| ${i.toString().padRight(8)} | '
'${i.runtimeType.toString().padLeft(11)} | '
'${(i is int).toString().padLeft(6)} | '
'${(i is double).toString().padLeft(9)} |');
}
}
return以下使用 DartPad 的是:
| toString | runtimeType | is int | is double |
| 0 | int | true | true |
| 0.5 | double | false | true |
| 1 | int | true | true |
| 1.5 | double | false | true |
| 2 | int | true | true |
虽然 DartVM returns:
| toString | runtimeType | is int | is double |
| 0.0 | double | false | true |
| 0.5 | double | false | true |
| 1.0 | double | false | true |
| 1.5 | double | false | true |
| 2.0 | double | false | true |
对于int
我们也可以这样做:
void main(List<String> args) {
print('| toString | runtimeType | is int | is double |');
for (int i = 0; i <= 2; i += 1) {
print('| ${i.toString().padRight(8)} | '
'${i.runtimeType.toString().padLeft(11)} | '
'${(i is int).toString().padLeft(6)} | '
'${(i is double).toString().padLeft(9)} |');
}
}
DartPad:
| toString | runtimeType | is int | is double |
| 0 | int | true | true |
| 1 | int | true | true |
| 2 | int | true | true |
DartVM:
| toString | runtimeType | is int | is double |
| 0 | int | true | false |
| 1 | int | true | false |
| 2 | int | true | false |
这是来自 doc
的示例医生说 必要时整数文字会自动转换为双精度数:
double z = 1; // Equivalent to double z = 1.0.
但是当我检查 runtimeType
时,类型是 int
print(z.runtimeType); // prints to int
我猜您正在使用 dartpad.dev 进行测试或将您的代码编译为 JavaScript。在 JavaScript 中,int
和 double
没有单独的类型,所以当使用 runtimeType
时,Dart 只是根据 JavaScript 以来的当前值猜测类型] 在内部将所有数字表示为 double
。
但是如果我们在Dart VM中运行或者编译为本地代码,我们可以确定类型。所以你的例子将 return double
作为 z
的类型 if 运行 Dart VM.
void main(List<String> args) {
print(1.1.runtimeType); // dartpad: double, dartvm: double
print(1.0.runtimeType); // dartpad: int, dartvm: double
print(1.runtimeType); // dartpad: int, dartvm: int
}
另请参阅 Dart 文档中有关 int
类型在编译为 JavaScript 时的不同行为的注释:
https://api.dart.dev/stable/2.12.3/dart-core/int-class.html
此处显示了一个更详细的示例,其中我们可以看到 double
声明的变量在 运行 DartVM 中的 Dart 代码与编译时的行为有何不同 JavaScript:
void main(List<String> args) {
print('| toString | runtimeType | is int | is double |');
for (double i = 0; i <= 2; i += 0.5) {
print('| ${i.toString().padRight(8)} | '
'${i.runtimeType.toString().padLeft(11)} | '
'${(i is int).toString().padLeft(6)} | '
'${(i is double).toString().padLeft(9)} |');
}
}
return以下使用 DartPad 的是:
| toString | runtimeType | is int | is double |
| 0 | int | true | true |
| 0.5 | double | false | true |
| 1 | int | true | true |
| 1.5 | double | false | true |
| 2 | int | true | true |
虽然 DartVM returns:
| toString | runtimeType | is int | is double |
| 0.0 | double | false | true |
| 0.5 | double | false | true |
| 1.0 | double | false | true |
| 1.5 | double | false | true |
| 2.0 | double | false | true |
对于int
我们也可以这样做:
void main(List<String> args) {
print('| toString | runtimeType | is int | is double |');
for (int i = 0; i <= 2; i += 1) {
print('| ${i.toString().padRight(8)} | '
'${i.runtimeType.toString().padLeft(11)} | '
'${(i is int).toString().padLeft(6)} | '
'${(i is double).toString().padLeft(9)} |');
}
}
DartPad:
| toString | runtimeType | is int | is double |
| 0 | int | true | true |
| 1 | int | true | true |
| 2 | int | true | true |
DartVM:
| toString | runtimeType | is int | is double |
| 0 | int | true | false |
| 1 | int | true | false |
| 2 | int | true | false |