Dart 2中的动态类型可以分配给差异类型的值以及如何编译推断它们?
例如,dart 2 中的 x 类型是什么,它会编译吗?
dynamic x = 1;
x = x + "Hello";
Dart 2中的动态类型可以分配给差异类型的值以及如何编译推断它们?
例如,dart 2 中的 x 类型是什么,它会编译吗?
dynamic x = 1;
x = x + "Hello";
dynamic类型很特殊。它的真正意思是“相信我,我知道我在做什么”并且它关闭了一些静态类型检查。
作为类型约束,dynamic实际上等价于Object(您可以将任何值赋给具有 type 的变量dynamic),但是当您尝试调用对象上的方法时,您可以尝试尝试,即使该方法不存在于Object.
在这种情况下,dynamic x = 1;因为1可分配给Object. 第 2 行失败。x = x + "Hello"; 尝试使用作为参数调用+方法,即使运算符存在,参数的类型也错误。1"Hello"+
你说“相信我,我知道我在做什么”,所以编译器让你尝试——没有静态警告或错误。你把它们打错了,所以运行时会在事情变得不健全之前阻止你。您也可以编写x.argleBargleGlopGlyf(42),即使您的程序中没有任何方法,编译器仍然不会阻止您argleBargleGlopGlyf。强大的静态力量伴随着巨大的动态责任。
在 Dart 2 中,dynamic是一种特殊的类型签名——表示任何东西。
在您上面的示例中,x是dynamic. 在第 1 行的运行时,它将是一个 int。所以如果你写print(x is int),它就会true。然而,静态地,它是dynamic。您将无法完成代码(尝试x.在 IDE 中输入。
下一行将是运行时错误(如果输入正确,则为静态错误)。
根据我的经验,在 Dart 2 中,您很少会使用dynamic关键字。