Dart中的类型信息是否绑定到is和as运算符?

gr8qqesn  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(119)

我有下面的代码在Dart编程语言

void main() {
    Object i = new A();
    bool b = (i is A);
    print(i.i); // this line gives error
    if (b) {
        print(i.i); // this executes with success
    }
}

也考虑这一个

void main() {
    Object i = new A();
    print(i.i); // this line gives error
    print((i as A).i);
    print(i.i); // this executes with success
}

当我们使用isas操作符时会发生什么。Dart是否在执行测试时附加了类型信息
这有点令人困惑。”””有人可以帮助吗?**
先谢谢你。

pepwfjgg

pepwfjgg1#

在某些情况下,Dart类型推断允许您 * 提升**局部变量 * 的类型。它基于is检查和(更少)as检查。它要求编译器绝对确保提升的类型在使用它的地方仍然有效,因此任何数量的事情都可以禁用提升,其中分配给提升的变量是最明显的。
最基本的促销是在

Object i = new A();
  if (i is A) print(i.i);

这是有效的,因为i is A检查将变量i提升到iftrue-分支上的A
然后您注意到测试不必在if内部。

Object i = new A();
  bool b = (i is A);
  if (b) print(i.i);

这是因为类型推断 * 记住了 * 提升信息沿着布尔值,所以它知道如果b为true,则iA。(明显的警告适用:编译器必须确保结果在if语句处仍然有效,因此基本上与类型提升的约束相同。
as升级的工作原理是将x as T视为(x is T ? x : (throw TypeError(....))),因此之后的所有代码都在该测试的true分支中,因为false分支抛出而不是继续。

pw136qt2

pw136qt22#

在Dart编程语言中,is和as分别用于类型检查和类型转换。

相关问题