gpt4 book ai didi

dart - 为什么可选参数的默认值必须是常量?

转载 作者:行者123 更新时间:2023-12-03 02:59:48 26 4
gpt4 key购买 nike

class Foo {
final DateTime date;
static final DateTime defDate = DateTime.now();

Foo([this.date = defDate]); // Error
}

这段代码有什么问题,我提供了一个 static final 值作为可选参数的默认值,但是 Dart 不接受它,任何人都可以请解释这种行为?


编辑:

// Global field
final DateTime defDate = DateTime.now();

class A {
void a([DateTime i = defDate]) => a; // Shouldn't have an error
}

class B extends A {
@override
void a([DateTime i = defDate]) => a; // Shouldn't have an error
}

最佳答案

出于多种原因,Dart 默认值必须是编译时常量。

首先,默认值被认为是实例方法签名的一部分。子类必须重写参数采用相同默认值的方法。如果在编译时不知道该值,那将毫无意义。

更重要的是,没有一个明显的时间应该计算表达式。 Dart 故意避免在启动 main 之前评估任何内容以减少启动延迟。唯一的异常(exception)是编译时常量,因为它们可以完全在编译时求值。这意味着当你第一次使用默认值的函数时,默认值还没有被评估。它肯定需要在那个时候被评估,至少如果你省略了参数的参数,所以编译器可能必须在函数调用的中间评估任意表达式。除了额外的开销,这本身就是一个问题,真正的问题是它使代码不可预测。在您的示例中,默认值将是 DateTime.now(),恰好是首次调用该函数的时间。

另一种方法是在每次调用函数时在没有参数的情况下评估默认值表达式。 Dart 语言团队正在考虑该选项(作为潜在的 future 举措,目前没有真正的计划),但这意味着放弃默认值是签名的一部分的想法。在语言做这样的事情之前,默认值必须是常量。

关于dart - 为什么可选参数的默认值必须是常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63269492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com