1

Dart 2中的动态类型可以分配给差异类型的值以及如何编译推断它们?

例如,dart 2 中的 x 类型是什么,它会编译吗?

dynamic x = 1;
x = x + "Hello";
4

2 回答 2

4

dynamic类型很特殊。它的真正意思是“相信我,我知道我在做什么”并且它关闭了一些静态类型检查。

作为类型约束,dynamic实际上等价于Object(您可以将任何值赋给具有 type 的变量dynamic),但是当您尝试调用对象上的方法时,您可以尝试尝试,即使该方法不存在于Object.

在这种情况下,dynamic x = 1;因为1可分配给Object. 第 2 行失败。x = x + "Hello"; 尝试使用作为参数调用+方法,即使运算符存在,参数的类型也错误。1"Hello"+

你说“相信我,我知道我在做什么”,所以编译器让你尝试——没有静态警告或错误。你把它们打错了,所以运行时会在事情变得不健全之前阻止你。您也可以编写x.argleBargleGlopGlyf(42),即使您的程序中没有任何方法,编译器仍然不会阻止您argleBargleGlopGlyf。强大的静态力量伴随着巨大的动态责任。

于 2018-04-03T08:55:35.297 回答
3

在 Dart 2 中,dynamic是一种特殊的类型签名——表示任何东西

在您上面的示例中,xdynamic. 在第 1 行的运行时,它将是一个 int。所以如果你写print(x is int),它就会true。然而,静态地,它是dynamic。您将无法完成代码(尝试x.在 IDE 中输入。

下一行将是运行时错误(如果输入正确,则为静态错误)。

根据我的经验,在 Dart 2 中,您很少会使用dynamic关键字。

于 2018-04-03T05:15:45.820 回答