当 const 列表无法以任何方式修改时,为什么不能在字符串文字中使用它?

iDe*_*ode 4 dart

void main() {
  const list = [1, 2, 3];
  const string = 'This is a $list'; // Error
}
Run Code Online (Sandbox Code Playgroud)

当我无法分配list新值并修改其任何元素时,为什么我不能list在字符串文字中使用 the ?

jam*_*lin 5

Dart 没有这样的概念:方法调用可以在编译时求值(与constexprC++ 不同)。const因此,Dart 无法保证在一个对象上调用方法会返回另一个const对象,这包括在进行字符串插值时的隐式调用.toString()

例如,这是完全合法的:

import 'dart:math';

final random = Random();

class Foo {
  const Foo();

  // Returns a string that is clearly not a compile-time constant.
  @override
  String toString() => random.nextInt(100).toString();
}

void main() {
  const foo = Foo();
  print('$foo');

  const list = [foo, foo, foo];
  print('$list');
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不适用于.toString()某些内置类型(例如 null、数字、字符串和布尔类型)的实现,因为已知它们会生成常量值,并且 Dart 不允许从这些类型创建派生类,因此它们不能被覆盖来进行像上面例子这样的恶作剧。