Dart 中的混合类型列表

问题描述 投票:0回答:1

在 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);  

可复制的DartPad

为什么?某种替代原则在起作用吗? ** 编辑:值得一提的是,这些代码适用于早期版本和较新版本的 Dart (3.3.4),它们的工作方式不同。例如,第一个代码根本无法编译,因为 data[1] 被视为对象而不是 int。因此,在最新版本的 Dart 中,第一个代码无法编译,而第二个代码可以编译且没有任何错误。

list dart
1个回答
5
投票

如果您希望列表仅接受一种类型,您需要添加

generic type
例如:

var  data = <int>["abcd", 34, "ef", false]; // -> Error

默认情况下,如果您不添加“最常见类型”(在本例中为对象),则将使用它,并且它将接受所有变量类型。

第二个示例确实可以编译,但会出现运行时错误,因为

data[1]
不是
int
而是
String

© www.soinside.com 2019 - 2024. All rights reserved.