Dart 静态常量-程序的顶层不允许静态常量-省道

Dart 静态常量-程序的顶层不允许静态常量-省道,dart,Dart,我已经研究了其他一些类似的问题,但它们似乎没有具体解决以下问题 我想要实现的是拥有不可更改的编译时常量 我有一个程序,我重新组织了一点,以消除混乱。程序在“main()”之前有一些常量声明。我将它们移动到一个类中,但是它要求我将它们声明为“staticconst”。然后我想,“main()”之前的其他“const”声明也应该是“static const”。然而,当我尝试这样做时,编辑建议“顶级声明不能声明为‘静态’”。例如 所以,我有点困惑。我认为“const”是静态的。为什么我必须在类中声明“

我已经研究了其他一些类似的问题,但它们似乎没有具体解决以下问题

我想要实现的是拥有不可更改的编译时常量

我有一个程序,我重新组织了一点,以消除混乱。程序在“main()”之前有一些常量声明。我将它们移动到一个类中,但是它要求我将它们声明为“staticconst”。然后我想,“main()”之前的其他“const”声明也应该是“static const”。然而,当我尝试这样做时,编辑建议“顶级声明不能声明为‘静态’”。例如

所以,我有点困惑。我认为“const”是静态的。为什么我必须在类中声明“static”?为什么我不能将“顶级”常量声明为“静态”?此外,以下各项之间的区别是什么:

static const int I_CORRECT_YN = 12;
const  int       I_CORRECT_YN = 12;
static final int I_CORRECT_YN = 12;
final int        I_CORRECT_YN = 12;    ?
声明不能更改的编译时值的最佳或唯一方法是什么

我想我是在看字面意思,但我想还有一个更复杂的意思

为什么我必须在类中声明“static”

因为实例变量/方法不能是
const
。这意味着每个实例的值可能不同,这对于编译时常量来说是不可能的

为什么我不能将“顶级”常量声明为“静态”

static
修饰符将变量/方法标记为类范围(类的每个实例的值相同)。顶级内容是应用程序范围的,不属于任何类,因此将它们标记为类范围是没有任何意义的,也是不允许的

声明不能更改的编译时值的最佳或唯一方法是什么

您已经在这样做了-在定义类常量时添加
static
。定义顶级常量时不要添加它。另外,使用
const
<代码>最终值变量不是编译时值

[省略了不同常量定义的源代码]之间的区别是什么

static const
const
几乎相同,用法取决于上下文。
const
final
之间的区别在于
const
是编译时常量-它们只能使用文本值(或由运算符和文本值组成的表达式)初始化,不能更改<代码>最终变量在初始化后也不能更改,但它们基本上是正常变量。这意味着可以使用任何类型的表达式,并且每个类实例的值可以不同:

导入“dart:math”;
随机r=新随机();
int getFinalValue(){
返回新的Random().nextInt(100);
}
课堂测试{
//每个实例的最终变量。
final int FOO=getFinalValue();
//每个类的最后一个变量。“const”在这里不起作用,getFinalValue()不是文本
静态最终整型条=getFinalValue();
}
//最终顶级变量
final int BAZ=getFinalValue();
//同样,这不起作用,因为静态顶级元素没有意义
//静态final int WAT=getFinalValue();
void main(){
测试a=新测试();
打印(测试条);
print(BAZ);//与Test.BAR不同
印刷品(a.FOO);
a=新测试();
打印(Test.BAR);//与以前相同
打印(BAZ);//和以前一样
print(a.FOO);//与以前不同,因为它是另一个实例,
//用另一个值初始化
//但这仍然是一个语法错误,因为变量是final。
//a.FOO=42;
}

我希望这能有所帮助,我没有把它描述得太混乱

是的,我想这很好地解释了,谢谢。我稍后会再讨论这个问题。还要注意,最终变量在第一次访问时是惰性初始化的。
static const int I_CORRECT_YN = 12;
const  int       I_CORRECT_YN = 12;
static final int I_CORRECT_YN = 12;
final int        I_CORRECT_YN = 12;    ?