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
关键字。