在 Dart 中编译:
var data = ["abcd", 34, "ef", false];
int n = data[1];
print(n*2); // -> 68
Run Code Online (Sandbox Code Playgroud)
我认为列表元素应该都是相同类型的。A) 中不存在从 int 到 string 或从 bool 到 string 的隐式转换:
print(data[1] is int); // -> true
print(data[3] is bool); // -> true
print(data[1] is String); // -> false
Run Code Online (Sandbox Code Playgroud)
编辑:正如 Mattia 指出的,以下几行中的真正错误与交换列表初始化中的元素无关,而是与从 A) 复制/粘贴到 B) 留下相同的索引 ([1])
这无法编译( “abcd”与 34 交换):
var data = [34, "abcd", "ef", false]; // -> type error
int n = data[1]; //EDIT: this is a non sense, should be data[0] (no error generated)
print(n*2);
Run Code Online (Sandbox Code Playgroud)
为什么?某种替代原则在起作用吗?
如果您希望列表仅接受一种类型,您需要添加generic type例如:
var data = <int>["abcd", 34, "ef", false]; // -> Error
Run Code Online (Sandbox Code Playgroud)
默认情况下,如果您不添加一个,则将使用“最常见类型”(在本例中为对象),并且它将接受所有变量类型。
第二个示例确实可以编译,但会给出运行时错误,因为data[1]不是 anint而是 aString