1

在为 Dart Analyzer 中的某些问题打补丁时,我需要了解 Null 本身是否被视为可空类型。

目前,Dart 的类型代数为 String 和 Null 计算的最小上界是 String。

但是,在我看来,String 和 Null 的类型联合是可以为空的 String。

有补丁的票:https ://github.com/dart-lang/sdk/issues/38585注意补丁还是有把T扩大到T的bug?如果闭包同时返回 T 和 null。

奖金问题(票https://github.com/dart-lang/sdk/issues/38623):Null 本身是可以为空的类型,应该以'?'为后缀吗?

我的观点是矛盾的证明(LUB 是最小上限函数):

  • 假设 Null 不可为空。
  • 这意味着 Null 和 Null?是不同的类型。
  • LUB(T, Null) = T?,即结合 T 和 Null 将 T 扩大到 T?
  • 因此,LUB(Null, Null) = Null?
  • 这违反了 LUB 的自反性,这意味着 LUN(Null, Null) = Null
  • 因此假设是错误的。
4

1 回答 1

2

Dart 还没有不可为空的类型。所以,写成的类型String 一个可以为空的字符串。该类型被认为是任何类型的子类型,因此and (nullable)Null的最小上限是 (nullable) 。NullStringString

当 Dart 获得不可为空的类型时,情况就会改变。然后写入的类型String将不可为空,并且可以为空,并且andString?的最小上限应该(希望!)是。不可为空的类型尚不可用,但它们正在设计中,预计将发布......好吧,当它们准备好时。NullStringString?

如果您尝试修补 Dart 分析器,那么您需要同时了解两种类型系统,因为如果您传递了正确的标志和正确的源代码,分析器已经被修改为识别一些不可为空的类型。

于 2019-09-28T12:31:15.590 回答