使用const在dart中声明list并修改它,给出运行时错误而不是编译时错误

yws3nbqq  于 2023-07-31  发布在  其他
关注(0)|答案(4)|浏览(106)

在dart中,为什么选择const cities = ['Delhi', 'UP', 'Noida'];
//错误在这一行
cities[0] = 'Mumbai';是运行时错误,而不是编译时错误?

k7fdbhmy

k7fdbhmy1#

有关dart中const的含义,请参见this answer
TLDR常量变量由dart预编译,您无法在运行时修改它们。

const cities = ['Delhi', 'UP', 'Noida'];
  cities[0] = 'Mumbai'; // Throws at runtime

字符串
使用final或var代替。

final cities = ['Delhi', 'UP', 'Noida'];
  cities[0] = 'Mumbai'; // Works OK

x7rlezfr

x7rlezfr2#

https://www.peachpit.com/articles/article.aspx?p=2468332&seqNum=5#:~:text=EXAMPLE%204.12&text= Unlike%20final%20variables%2C%20properties%20of,its%20values%20cannot%20be%20changed.
使用普通变量,与常量一样,在运行时不能更改列表的值。我假设这是用varfinal完成的,因为我自己不是 dart 大师。

o8x7eapl

o8x7eapl3#

目前在Dart中没有办法指示一个方法是否改变了它的对象,或者保证不改变它。(这与C不同,在C中,一个方法可以标记为const,以表明它不会(明显地)改变对象。
因此,Dart编译器没有好的方法来知道不应该允许在const对象上调用operator []=,所以不幸的是,直到运行时才知道它违反了对象的const特性。

u5i3ibmn

u5i3ibmn4#

当你使用const关键字声明一个列表时,它创建了一个不可变的列表,这意味着你不能修改它的元素或改变它的长度。但是,Dart的静态分析无法在编译期间捕获此错误,因为add方法是List对象上的有效方法,并且只有在运行时尝试修改不可变列表时才能检测到。

相关问题