7

考虑以下代码,它是在启用了可空引用的上下文中编写的:

static string GetStr() => "test";

public static void Main() {
    var s = GetStr();
}

s被隐式键入为 astring?而不是 a string

这是设计使然,正如MSDN 的 var 官方文档中提到的那样:

当 var 与启用的可空引用类型一起使用时,它始终暗示可空引用类型,即使表达式类型不可为空。

但这是为什么呢?是因为变量可能会在以后重新分配吗?

此外,即使它是键入的,因为string?我可以在没有警告的情况下取消引用它:

if (s.Length > 10) return; // Emits no compiler warning

但是,如果我创建另一个确实返回 astring?的方法,如果我尝试取消引用,编译器现在会发出警告,即使两个变量都键入为string?

static string? GetStrMaybe() => "test";

public static void Main() {
    var s = GetStrMaybe();
    if (s.Length > 10) return; // Compiler emits a warning because I'm dereferencing 's' without checking for null
}

答案基本上是“编译器在后台跟踪空状态”,并且隐式类型的变量类型有点被忽略吗?

我觉得这很奇怪,因为在这两种情况下,s都键入为string?,但只有在后一个示例中,如果我在没有检查的情况下取消引用,编译器才会发出警告。需要明确的是,这是我最终所期望的,但正是我们到达那里的方式让我感到困惑。

4

0 回答 0