如果我有C#8代码:
class Foo {}
然后:
#nullable enable
var bar = new Foo();
然后的类型bar
是Foo?
。这显然new
很不正确,因为表达式无法返回null
。为什么会bar
成为可空引用?我什至查阅了Nullable Reference Type Specification,发现了以下内容:
永不为空的表达式
以下表达式形式的null状态始终为“ not null”:
- ...
new
表达式(对象,委托,匿名对象和数组创建表达式)- ...
并且:
var的类型推断
用var声明的局部变量推断的类型由初始化表达式的null状态告知。
var x = E;
如果的类型
E
是可为空的引用类型,C?
并且的null状态E
为“不为null”,x
则为推断的类型为C
。否则,推断的类型为的类型E
。
x
如上所述,根据的注释上下文确定要推断出的类型的可为空性var
,就好像该类型已在该位置上明确给出一样。
因此,基于我在规范中可以找到的所有内容,bar
在我非常简单的示例中,应该是type Foo
,而不是type Foo?
。我想念什么?
如果var
要从表达式中推断出它的可空性,那么在许多情况下,您以后将无法为其分配a null
。例如,var s = "";
。进行了讨论以允许var?
表达“该类型的可为空的版本”,但是它有几个问题。会var
限制常规来推断非空类型吗?
如果是,则(1)由于用户需要添加更多?
批注,我们正在造成采用上的痛苦;(2)我们已经使用的var
模式的可空性不一致;(3)带有可空值类型的某些问题(int?
)。如果否,那么代码的意图将不是很清楚。var?
会明确指出可为空的类型,但var
会混合包含可为空和不可为空的类型。
从2019年12月18日开始var
的LDM注释中记录了推断可空类型的决定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句