为什么隐式类型的本地变量总是可为空的?

问题描述

考虑下面的代码,写在一个可空引用启用的上下文中:

static string Getstr() => "test";

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

s 被隐式输入为 string? 而不是 string

这是设计使然,正如 MSDN's official documentation for var 中提到的:

当 var 与可空引用类型一起使用时,即使表达式类型不可为空,它也总是暗示可空引用类型。

但这是为什么呢?是不是因为后面的变量可能会被重新赋值?

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

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

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

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,但只有在后一个例子中,如果我在没有检查的情况下取消引用,编译器才会发出警告。需要明确的是,这正是我最终所期望的,但正是我们到达那里的方式让我感到困惑。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)