为什么 Dart Null Safety 原则只适用于静态类型的变量而不是类型推断?

Why Dart Null Safety principles only apply on the statically typed variables not type inferred?

我正在研究 dart null 安全概念,我发现所有原则仅适用于静态类型变量,例如 int a,而不适用于使用 'var' 关键字声明的推断类型。为什么 null 安全规则适用于使用 'var' 关键字创建的变量之一?我只想知道 dart 不处理类型推断变量的原因。谢谢

在我回答你的问题之前,这里是基本原则:

String? nullableString; // is currently null

String nonNullableString; // needs to be initialized, because it can´t be null

var myVariable; // will always be dynamic (see comment from jamesdlin)

var myVariable = "Hello World"; 
// var is non-nullable, since the non-nullable type String can be inferred

对比type? variable; // variable can be null.

为什么 Dart Null Safety 原则只适用于静态类型变量而不是类型推断?

原因很简单,Dart会根据初始值推断var是nullable还是non-nullable类型,所以你没有理由写“var?”之类的东西。可以说,Dart 基本上是在幕后处理类型推断变量。

I am studying dart null safety concepts and I have found that all principles apply only on the statically typed variables, int a for example, not on the type inferred the ones declare with var keyword.

空安全概念 do 适用于推断类型:

int? f() => 42;

var x = f(); // The static type of `x` is `int?`.

确实,您目前无法编写 var? 来显式声明变量应使用可空版本的推断类型。这是 Dart 语言团队已经考虑过的并且仍然愿意添加的东西。参见:

其中 Lasse Nielsen explains:

The reason var? is not supported is, roughly, that ? is something you add on types, and var is not a type. It's a declaration marker that occurs instead of a type, like final - except that final can also be combined with at type, while var can't.

您想要使用 var? 的情况是您有一个非 null 初始值 并且 想要将该变量设置为null 稍后。实际上,我希望这些情况不会很常见,因此它不是优先功能。对于这种情况,您应该使用显式类型声明变量(例如 int? x = 42;)。

如果您真的想要避免键入类型名称,您可以应用Erik Ernst's suggestion。例如:var x = null ?? 42;.

或者你可以创建一个辅助函数:

T? makeNullable<T>(T object) => object;

var x = makeNullable(42);

但我个人认为这些方法有些矫枉过正,可读性较差。

Dart 为我们提供了多种选项来处理可空变量和不可空变量。当你很明显时,Dart 要求我们使用类型注释,我们可以使用 null 安全规则使我们的代码免受 null 的影响,我们可以使用 var 关键字,当有可能为 null 并且保护 var 来自 null,因为它允许将 null 放入其中。