Types 为什么在Dart语言中测试(null为Type)的计算结果为false?

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

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 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
的类型上添加
测试可空类型,或者不更改并保持对不可空类型的测试