我有下面的代码在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
}
当我们使用is
和as
操作符时会发生什么。Dart是否在执行测试时附加了类型信息?
这有点令人困惑。”””有人可以帮助吗?**
先谢谢你。
2条答案
按热度按时间pepwfjgg1#
在某些情况下,Dart类型推断允许您 * 提升**局部变量 * 的类型。它基于
is
检查和(更少)as
检查。它要求编译器绝对确保提升的类型在使用它的地方仍然有效,因此任何数量的事情都可以禁用提升,其中分配给提升的变量是最明显的。最基本的促销是在
这是有效的,因为
i is A
检查将变量i
提升到if
的true
-分支上的A
。然后您注意到测试不必在
if
内部。这是因为类型推断 * 记住了 * 提升信息沿着布尔值,所以它知道如果
b
为true,则i
是A
。(明显的警告适用:编译器必须确保结果在if
语句处仍然有效,因此基本上与类型提升的约束相同。as
升级的工作原理是将x as T
视为(x is T ? x : (throw TypeError(....)))
,因此之后的所有代码都在该测试的true
分支中,因为false
分支抛出而不是继续。pw136qt22#
在Dart编程语言中,is和as分别用于类型检查和类型转换。