为什么我不能用 Dart 中作为函数参数接收的原始值来初始化 "const" 变量?

Why can't I initialize a "const" variable with a primitive value received as a function argument in Dart?

我了解到,在 Dart 中,原语是按值传递的,而对象是按引用传递的。
所以,我预计

void test(String phrase) {
    const _phrase = phrase;
}

会导致错误,但是

void test(int amount) {
    const _amount = amount;
}

不会。

但是,它们都抛出相同的编译时错误:Const variables must be initialized with a constant value.

这是某些未实现的功能还是在 const 变量初始化中不接受函数参数背后的原因?

我相信答案是常量在编译时而不是 运行 时是固定的,所以函数参数不能传递给它们,因为函数只在 运行 时执行。

例如,另请参见此处

不过,用 final 修饰符代替 const 也可以。

顺便说一下,我认为 String 也是一种原始类型。看这里

Dart 常量变量必须使用编译时常量表达式进行初始化。 编译时常量表达式必须 始终 具有相同的值——每个 源位置.

恰好一个值

Dart 没有这样的“常量值”。它有常量表达式,众所周知,这些表达式可以精确地计算出一个值,并且可以在编译时知道这个值。这允许编译器规范化这些常量值,因此评估为具有相同 state 的常量对象的不同常量表达式被规范化为相同的 object

您的 amount 变量不是编译时常量表达式。它在不同的时间可以有不同的值(因为它是一个函数参数,人们可能会用不同的参数调用函数),所以它不能是一个常量表达式。

因此不能用来初始化常量变量,因为常量变量只能有一个值。

void test(int amount) {
  const _amount = amount;
  const list = [_amount]; // <- MUST ALWAYS HAVE SAME VALUE
}

简而言之:Dart 常量变量必须使用编译时常量表达式进行初始化。常量表达式必须始终具有相同的值。这是关于 Dart 常量表达式的基本规则,大多数其他限制都源于此。 (例如,正在使用的常量变量是常量表达式,因此它必须始终绑定到相同的值,这就是为什么必须使用常量表达式对其进行初始化的原因。)