Types 为什么在Dart语言中测试(null为Type)的计算结果为false?
Dart语言声明: 空类型已移动到类型层次结构的底部。作为 因此,它被认为是所有其他类型的子类型。空文本 始终被视为底部类型 如果Null是底层类型,Null是Null类的唯一实例,那么为什么下面的测试Types 为什么在Dart语言中测试(null为Type)的计算结果为false?,types,dart,Types,Dart,Dart语言声明: 空类型已移动到类型层次结构的底部。作为 因此,它被认为是所有其他类型的子类型。空文本 始终被视为底部类型 如果Null是底层类型,Null是Null类的唯一实例,那么为什么下面的测试(Null是B)计算结果为false class A {} class B extends A{} void main() { B b = new B(); print(b is B); // true print(b is A); // b is A because B is su
(Null是B)
计算结果为false
class A {}
class B extends A{}
void main() {
B b = new B();
print(b is B); // true
print(b is A); // b is A because B is subtype of A
print(null is B); // false
}
因为
是
测试就是这样定义的。对于类类型,它执行子类检查,而不是子类型检查
这样做是因为执行is
检查是不切实际的,并且仍然不知道是否可以安全地调用对象上的方法。这意味着如果(x是Foo&&x!=null)x.fooMethod(),您将始终必须执行代码>。因此,is
检查检查元素是否具有已检查的类型,并且不是null
(除非null
是该类型的子类)
实际上,Dart中的类型(当前)都被认为是可为空的。也就是说,当你写intx
您声明的变量可能包含int
或null
。在大多数编写类型的地方,它被隐式地认为是该类型的可空版本(该类型或Null)。is
测试是一个例外,其中类型仅被视为自身
如果Dart在将来的某个时候获得不可为空的类型,则必须编写类似于int?
的代码来获得可为空的类型,以及int
来获得不可为空的版本。此时,您将能够在is
的类型上添加?
测试可空类型,或者不更改并保持对不可空类型的测试