NNBD:字符串和空值的最小上限

时间:2019-09-27 21:50:26

标签: dart dart-2 dart-analyzer

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

当前,由Dart的类型代数为String和Null计算的最小上限为String。

但是,我认为String和Null的类型并集是可为null的String。

带补丁程序的票证:https://github.com/dart-lang/sdk/issues/38585请注意,补丁程序在将T扩展到T时仍然存在错误。如果闭包同时返回T和null。

奖金问题(机票https://github.com/dart-lang/sdk/issues/38623):Null本身是否是可为null的类型,应该在其后缀“?”吗?

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

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

1 个答案:

答案 0 :(得分:1)

Dart尚未具有不可为null的类型。因此,写为String 的类型是可为空的字符串。 Null类型被认为是任何类型的子类型,因此Null和{nullable} String的最小上限是(nullable)String

当Dart获取不可为空的类型时,它将改变。然后,写成String的类型将是不可为空的,而String?将是可为空的,并且(希望如此)NullString的最小上限应为{ {1}}。非空类型尚不可用,但是它们正在设计中,有望在准备就绪时被释放。

如果您想修补Dart分析器,则需要注意相同类型的两个类型系统,因为如果传递正确的标志和正确的标志,分析器已被修改为可以识别某些非空类型源代码。