dart - 为什么 Dart 中允许不正确的类型分配?

标签 dart dartium

我知道 Dart 的类型几乎是可选的,但如果我选择指定变量类型,我希望得到类似 int i = "abc" 的赋值。在运行时抛出错误。然而,这和以下任何一个都不会引发错误,它们只是忽略类型转换。

  String str     = "test";
  int integer    = 5;
  double decimal = 1.5;
  List list      = [1,2,3];

  String s = decimal;   print(s);  // 1.5
  int i    = str;       print(i);  // test
  double d = list;      print(d);  // [1, 2, 3]
  List l   = integer;   print(l);  // 5

this tutorial我发现,它说:

But the snippet below generates an error because the compiler identifies b as an int that is wrongly being assigned a double value. This is type-checking in action, and one of the many ways that Dart improves on JavaScript.

int b=7898765;

b = 9.8; // ERROR Can't assign double to int

但是,无论是在使用 Dartium 还是在使用 <script src="packages/browser/dart.js"></script> 时,该代码都不会为我生成错误。 .

如果我这样做 var i = "abc" + 1.5 ,它会抛出一个错误,那么为什么类型错误分配不做同样的事情呢?这是疏忽还是设计选择?如果是后者,原因是什么?

提前致谢。

最佳答案

此答案仅适用于 Dart 1.x

在 Dart 中,在生产模式(默认)下运行时,类型注释将被忽略。如果您以检查模式运行,则会检查类型。如果您在实例上调用不存在的方法,仍会抛出异常。

var i = "abc" + 1.5

+ 运算符(方法)显然会对参数进行类型检查并抛出异常,因为它不是非字符串值。

对于从 Dart 生成的 JS,您可以通过添加 $dart2js 转换器来生成“检查模式”输出

transformers:
- $dart2js:
    checked: true

到您的 pubspec.yaml 文件(有关更多 $dart2js 选项,请参阅 Configuring the Built-in dart2js Transformer for Pub )。 这仅在您使用 pub build 构建时生效。如果您直接使用 dart2js 生成 JS,请传递 -c 标志以创建检查模式输出。

对于在服务器 VM 上运行的代码,还传递 -c 标志

dart -c your_script.dart

在您的问题中,您没有提供有关如何运行 Dart 脚本或如何生成 JS 的任何信息。

在这个简单的DartPad编辑器显示来自静态分析的错误,这是添加类型注释的另一个用例。

关于dart - 为什么 Dart 中允许不正确的类型分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33424185/

相关文章:

flutter - 错误: Not a constant expression.( flutter )

button - 带有透明png的Flutter按钮

oop - Dart:泛型抽象静态方法

google-chrome - 在 Debian 7 上编译 Dart 和 Dartium

dart - 断点在Dart编辑器中不起作用

javascript - 是否可以忽略 keyCode = 229 的按键事件?

button - 如何在 IconButton 上产生圆形波纹效果?

video - 在 Flutter 中播放内联视频?

dart - Google Dart构建中的/packages/$ sdk/文件夹是做什么用的?

Dart 导入在 NoSuchMethodError 中显示窗口结果