标识符显示Dart:core中的元素



如果在当前dart文件中定义了标识符,那么该标识符将显示在使用import指令包含的其他文件中定义的具有相同标识符的元素。当在当前文件中使用这样的标识符时,没有错误发生,使用当前文件的版本。

如果在文件1和文件2中定义了某个id,但在当前文件中没有定义,则在尝试应用该标识符时将发生错误,可以通过使用import前缀或show, hide命令来消除该错误。

上面描述的逻辑很清楚。但是在使用dart:core库时,可能会出现以下错误。让我们以print函数为例来考虑错误的原因。

如果当前文件中没有定义print函数,而该函数在其中一个导入文件中定义,则该库的dart:core版本将显示为灰色。不会生成需要import前缀或show/hide命令的编译错误。

所描述的情况可能导致混淆。这同样适用于其他一些核心库。下面是一些例子。

// test2.dart
void print() {
}
// test.dart
import 'test2.dart';
void main() {
// some useful function from test2.dart
print2();
// static error due to inappropriate argument types,
// not due to collision with print function from dart:core
print('work is done');
}

当显式包含dart:core文件时,此错误仍然存在。

就以上所述,有以下问题:

  1. dart开发人员会阅读我的消息吗,或者他们需要转发到哪里才能阅读?

  2. 这真的是一个bug吗?我建议改正它,使语言更简单易懂。

我期望如果其中一个文件中的标识符与dart:core库中的标识符匹配,则其行为将与简单的其他包,文件。

对于来自平台(dart:)库的名称,名称冲突的规则是特殊的。

通常,如果通过两个不同的导入导入具有相同名称的不同声明,则会产生冲突。如果您试图引用该名称,将会得到一个错误,因为编译器无法确定您指的是哪个名称。

但是,如果您导入了具有相同名称的不同声明,并且有些(但不是全部)来自dart:库,那么来自dart:库的声明将被忽略,而非平台库将优先考虑。(如果只有一个声明来自非dart:库,它只是正常工作。)

这个异常的原因是Dart库通常来自包,在包中您可以控制获得的库的版本。如果不执行dart pub update或类似操作,您将无法获得新的声明。这意味着只有在您积极开发时才会引入新的名称冲突,然后您才能处理。

平台库来自SDK,您的SDK可以独立于您正在处理的包进行更新。即使你彻底测试了你的应用程序,并将所有依赖项锁定到你知道可以工作的特定版本,它也可能最终运行在一个更新的SDK上。

因此,向平台库中添加新的声明被认为比将它们添加到普通包中更危险。为了避免向平台库中添加任何内容实际上是不可能的,因此决定不将这种新的冲突变为错误。

如果平台库引入了一个新的声明,它不应该影响您的导入。它不会引发新的冲突。(它可能导致其他错误,因为在Dart中没有任何API更改是完全安全的,但至少它不会导致导入冲突。)

最新更新