为什么当我明确说类型是double时,dart将变量类型推断为int?

这是文档中的示例

该文档说整数文字在必要时会自动转换为双精度:

double z = 1; // Equivalent to double z = 1.0.

但是当我检查runtimeType类型是int

print(z.runtimeType); // prints to int

回答

我猜您正在使用 dartpad.dev 进行测试或将您的代码编译为 JavaScript。在JavaScript中,没有单独的类型intdouble达特所以都只是猜测的类型,使用时runtimeType,基于自JavaScript的是代表所有数值作为当前值double在内部。

但是如果我们在 Dart VM 中运行或编译为原生代码,我们可以确定类型。因此,您的示例将double作为z使用 Dart VM 运行的if类型返回。

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
}
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
}

另请参阅intDart 文档中有关编译为 JavaScript 时类型的不同行为的注释:https :
//api.dar

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)} |');
  }
}
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)} |');
  }
}

t.dev/stable/2.12.3/dart-core/int-class.html

这里展示了一个更详细的例子,我们可以看到double在 DartVM 中运行 Dart 代码时声明的变量的行为与编译后的 JavaScript 有何不同:

使用 DartPad 返回以下内容:

虽然 DartVM 返回:

因为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)} |');
  }
}

飞镖板:

| 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 |

飞镖:

| 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 |


以上是为什么当我明确说类型是double时,dart将变量类型推断为int?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>