Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 为什么常量列表可以';如果可以';不能以任何方式修改吗? void main(){ 常量列表=[1,2,3]; 常量字符串='这是一个$list';//错误 }_Dart - Fatal编程技术网

Dart 为什么常量列表可以';如果可以';不能以任何方式修改吗? void main(){ 常量列表=[1,2,3]; 常量字符串='这是一个$list';//错误 }

Dart 为什么常量列表可以';如果可以';不能以任何方式修改吗? void main(){ 常量列表=[1,2,3]; 常量字符串='这是一个$list';//错误 },dart,Dart,当我不能分配list一个新值并修改它的任何元素时,为什么我不能在我的string literal中使用list?Dart的概念不是说可以在编译时计算方法调用(与C++中的constepr相反)。因此,Dart不能保证在常量对象上调用方法会返回另一个常量对象,这包括在执行字符串插值时对.toString()的隐式调用 例如,这是完全合法的: import'dart:math'; 最终随机=随机(); 福班{ const Foo(); //返回一个明显不是编译时常量的字符串。 @凌驾 字符串toSt

当我不能分配
list
一个新值并修改它的任何元素时,为什么我不能在我的string literal中使用
list

Dart的概念不是说可以在编译时计算方法调用(与C++中的
constepr
相反)。因此,Dart不能保证在
常量
对象上调用方法会返回另一个
常量
对象,这包括在执行字符串插值时对
.toString()
的隐式调用

例如,这是完全合法的:

import'dart:math';
最终随机=随机();
福班{
const Foo();
//返回一个明显不是编译时常量的字符串。
@凌驾
字符串toString()=>random.nextInt(100.toString();
}
void main(){
常量foo=foo();
打印(“$foo”);
常量列表=[foo,foo,foo];
打印(“$list”);
}

请注意,这不适用于某些内置类型(例如null、numeric、string和boolean类型)的
.toString()
实现,因为已知它们会生成常量值,而且Dart不允许从这些类型创建派生类,因此,它们不能被覆盖以执行上述示例中的恶作剧。

这是一个有趣的问题,因为一些
const
事物可以插入
const
字符串中。我查看了,它给出了这个例子,非常接近你的问题:

// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];

const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';
给出的解释是

文字字符串是编译时常量,只要有 插值表达式是一个编译时常量,其计算结果为 null或数字、字符串或布尔值


他们没有解释原因(技术原因是什么,或者语言以这种方式工作的动机是什么),但很明显,
const
列表的计算结果不是“null或数字、字符串或布尔值”因此,列表是否为
const
,并不重要-使用该字符串插值生成的字符串将不是编译时常量,因此您不能将
const
与该字符串一起使用。

您能告诉我从哪里可以找到这一行吗Dart的概念并不是说方法调用可以在编译时进行评估“。我不能指出缺少什么。请注意,
const
构造函数无法从函数调用初始化成员的原因是无法指定函数/方法调用可以在编译时进行求值。此注释支持第一行。谢谢,我刚刚看到你编辑了代码,昨天我正要问你(太累了,不能打字)你的例子在文章中有什么帮助。关于它们的“原因”:null、numeric、string和boolean类型的
.toString()
实现已知会产生常量值。因为Dart不允许从这些类型创建派生类,所以它们不能被重写来执行我在中演示的恶作剧。我已经阅读了文档,这就是为什么我问“为什么”的原因,因为文档中没有提到它。谢谢你的回答!