Dart 编译器是否能够推断出 const 构造函数的用法?

Is Dart compiler able to infer the usage of const constructor?

我认为 dart 将使用 const 构造函数,如果它能够自动执行的话,为了解释这个假设让我们假设我们有一个已经有 const constructor 的小部件喜欢:

class Retry extends StatelessWidget {
  const Retry();
}

然后因为 dart“能够推断出 const 用法”,接下来的两个代码将意味着并编译成相同的代码:

1.

Container(
   child: Retry()
)
Container(
   child: const Retry()
)

是否假设 dart 可以推断他必须对声明了该选项的 class 使用 const 构造函数?或者不是? 我怎样才能证实它?

Dart 无法推断出您希望该对象成为 const,除非围绕它的某些上下文强制它成为 const。在您显示的示例中情况并非如此。如果你想让 dart 做出一些东西,你 必须 在某些时候使用 const 关键字 const.

推断的例子const

const SizedBox(
  child: Retry(),
)

SizedBox 上的 const 强制 Retryconst。这种情况和类似情况是唯一隐含 const 的地方。

不,Dart 编译器不会推断 const 除非句法上下文需要常量,例如如果您编写 const [A()]A() 放入 const 上下文中,这意味着 const [A()]const [const A()] 相同,几乎没有其他地方适用(例如元数据 @A()).

一般来说,Dart 编译器无法在语言规范要求它这样做的地方之外推断 const,因为它可能会潜在地改变程序的语义。考虑:

class A {
  const A();
}

final Set<A> s = <A>{};
void foo(A a) {
  s.add(a);
}

void main() {
  foo(A());
  foo(A());
  print(s.length);
}

如果编译器只是将 const 放在构造函数调用上,那么该程序将打印 1,但它应该打印 2.