这在 Dart 中编译:
var data = ["abcd", 34, "ef", false];
int n = data[1];
print(n*2); // -> 68
我认为列表元素应该都是相同类型的。并且 A) 中不存在从 int 到 string 或从 bool 到 string 的隐式转换:
print(data[1] is int); // -> true
print(data[3] is bool); // -> true
print(data[1] is String); // -> false
编辑:正如 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);
为什么?某种替代原则在起作用吗? ** 编辑:值得一提的是,这些代码适用于早期版本和较新版本的 Dart (3.3.4),它们的工作方式不同。例如,第一个代码根本无法编译,因为 data[1] 被视为对象而不是 int。因此,在最新版本的 Dart 中,第一个代码无法编译,而第二个代码可以编译且没有任何错误。
如果您希望列表仅接受一种类型,您需要添加
generic type
例如:
var data = <int>["abcd", 34, "ef", false]; // -> Error
默认情况下,如果您不添加“最常见类型”(在本例中为对象),则将使用它,并且它将接受所有变量类型。
第二个示例确实可以编译,但会出现运行时错误,因为
data[1]
不是 int
而是 String