如果我有 C# 8 代码:
class Foo {}
Run Code Online (Sandbox Code Playgroud)
然后:
#nullable enable
var bar = new Foo();
Run Code Online (Sandbox Code Playgroud)
那么 的类型bar是Foo?。这显然不正确,因为new表达式不能返回null。为什么会bar是一个可为空的引用?我什至查阅了Nullable Reference Type Specification,发现了以下内容:
永远不为空的表达式
以下表达式形式的空状态始终为“非空”:
- ...
new表达式(对象、委托、匿名对象和数组创建表达式)- ...
并且:
var 的类型推断
为用 var 声明的局部变量推断的类型由初始化表达式的空状态通知。
Run Code Online (Sandbox Code Playgroud)var x = E;如果类型
E是可空的引用类型C?和空状态E是“不空”,则推断该类型x是C。否则,推断的类型是 的类型E。推断的类型的可空性
x如上所述确定,基于 的注释上下文var,就像在该位置明确给出类型一样。
因此,根据我在规范中可以找到的所有内容,bar在我非常简单的示例中,应该是 type Foo,而不是 type Foo?。我错过了什么?