考虑以下代码,它是在启用了可空引用的上下文中编写的:
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?
,但只有在后一个示例中,如果我在没有检查的情况下取消引用,编译器才会发出警告。需要明确的是,这是我最终所期望的,但正是我们到达那里的方式让我感到困惑。