我已将枚举实现为地图的键,但是我发现Dart在检索值时不提供类型安全性。
例如,以下代码不会导致编译错误:
enum Animal {Bird, Cat, Dog, Horse}
Map<Animal, String> petNames = {
Animal.Bird: 'Lucky',
Animal.Cat: 'Cleo',
Animal.Dog: 'Spot',
Animal.Horse: 'Sleven',
};
String birdName = petNames[Animal.Bird]; // Positive test
String catName = petNames[1]; // What I want to test
String dogName = petNames['two']; // My control, I expected a compilation error
print(birdName); // Output as expected: Lucky
print(catName); // Output is null
print(dogName); // Output is null
这是Dart中的缺陷吗?
答案 0 :(得分:1)
不,这不是错误。 Here可以在执行petNames[1]
或petNames['two']
之类的命令时检查您在呼叫什么。在内部,Dart将方括号内的值用作Object
,因为您使用的是[]
运算符。
当您检查Map definition时,可以看到将其定义为通用类型(带有参数K
和V
)。例如,当您为该地图上的某个键分配一些值时:
petNames[Animal.Bird] = 'New Bird Name'
您正在使用运算符[]=
,并且该运算符调用函数isValidKey()
来检查键(示例中的Animal.Bird
)是否为K
类型({{ 1}}),值(示例中为Animal
)的类型为'New Bird Name'
(V
)。
但是使用String
运算符时不会调用isValidKey()
函数。
因此,就像在Dart中一样,所有对象都是对象,并且[]
运算符得到一个[]
作为输入,当您调用Object
时,Dart会尝试找到该键,即使它不是petNames['two']
类型。
有关更多信息,请检查上方的链接以及Dart Lang SDK上的issue。