Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Dart中允许不正确的类型分配?_Dart_Dartium - Fatal编程技术网

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

为什么Dart中允许不正确的类型分配?,dart,dartium,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

我知道类型在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
在《我发现》中,它说:

但是下面的代码段生成了一个错误,因为编译器将b标识为int,而该int被错误地分配了一个双精度值。这是实际的类型检查,也是Dart改进JavaScript的许多方法之一

int b=7898765

b=9.8;//错误:无法将double分配给int

但是,无论是在使用Dartium还是在使用
时,该代码都不会为我生成错误

如果我执行
var I=“abc”+1.5
,它会抛出一个错误,那么为什么类型错误赋值不执行同样的操作呢?这是一个疏忽还是一个设计选择?如果是后者,原因是什么

提前感谢。

此答案仅适用于Dart 1.x 在生产模式(默认)下运行时,省道类型注释将被忽略。如果在选中模式下运行,则会选中类型。如果在实例上调用不存在的方法,仍然会引发异常

var i = "abc" + 1.5
+
操作符(方法)显然会对参数进行类型检查并抛出,因为它不包含非字符串值

对于从Dart生成的JS,您可以通过添加

transformers:
- $dart2js:
    checked: true
到您的
pubspec.yaml
文件(有关更多
$dart2js
选项,请参阅)。 这仅在使用
发布构建
进行构建时生效。如果直接使用
dart2js
生成JS,请传递
-c
标志以创建选中模式输出

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

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


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

Dart 2.6拒绝此代码

A value of type 'double' can't be assigned to a variable of type 'String'

我还测试了
地图
(为了更好地理解地图)


非常感谢。检查模式很好了解,我将在开发时使用它。我现在只是想用选中的标志开始Dartium,看看它能做什么(在windows上,所以它给了我一些态度)。至于如何生成JS,我现在使用Dartium,因为我讨厌通过生成的代码进行调试,但通常我只使用Chrome开发编辑器。例如,如果您使用WebStorm,在Dartium或服务器端脚本中进行调试时,选中模式始终是默认模式。如果这回答了您的问题,请接受。您需要更多信息吗?虽然您的回答很有帮助,而且知道我可以使用checked模式调试代码也很好,但我的问题更多的是关于语言设计的决策。我不明白他们为什么选择默认情况下不将类型错误分配为错误,这似乎是应该的。我还是喜欢你,但那更是我好奇的事。没关系。我只是想知道你的问题是否得到了充分的回答,或者你只是忘记接受;-)。Dart具有独特的设计/理念。下面是一篇Dart语言设计师的论文。正如我在回答中所写的,类型注释通常在运行时被忽略。这是一个基本的省道设计决策。Checked模式是一种开发工具,它允许验证类型注释是否与运行时指定的实际类型相符。
void main() {
  Map<String, dynamic> map = {
    'str': 'test',
    'integer': 5,
    'decimal': 1.5,
    'list': [1,2,3]
  };

  String s = map['decimal'];   print(s);  // JSDouble not String
  int i    = map['str'];       print(i);  // JSString not int
  double d = map['list'];      print(d);  // JSArray not double
  List l   = map['integer'];   print(l);  // JSInt not List
}
TypeError: 1.5: type 'JSDouble' is not a subtype of type 'String'