问题描述
我无法理解 dart 中的常量构造函数和构造函数初始值设定项列表。
...
<button class="btn btn-warning btn-xs"
type="submit" id="submit">
...
let submit = e.target.getElementById('submit');
...
所有这些类及其构造函数都是合法的。除了 class A {
const A();
}
class B {
const B();
final A a = const A();
}
class C {
const C(): a = const A();
final A a;
}
class D {
const D(): b = const B();
final B b;
}
class E {
const E(): a = const B().a; // <- Lint: Invalid constant value
final A a;
}
和 E
构造函数。
我不明白的是 E()
构造函数是有效的:
D
但是 const C(): a = const A();
无效:
E
这让我有点困惑,为什么 const E(): a = const B().a; // <- Lint: Invalid constant value
可以是一个常量值而 B()
不是?我会想如果一个对象是一个常量构造函数,B().a
也会是一个常量值。
我在这里遗漏了什么?
解决方法
这让我有点困惑,为什么 B()
可以是一个常量值而不是 B().a
不是?我会想如果一个对象是一个常量构造函数,B().a
也会是一个常量值。
Dart 没有 C++ 中的 constexpr
等价物。 Dart 无法传达方法/函数可以作为编译时常量表达式进行计算和调用。
B().a
在 a
上调用名为 B()
的 getter。仅仅因为 const B()
是一个 const
对象并不意味着 const B().a
返回一个常量值。例如,B
的实现可以是:
class B {
const B();
// Returns a new `A` instance each time.
A get a => A();
}