C# 在C 8中,为什么对新表达式的类型推断会导致可为空的引用?
如果我有C 8代码:C# 在C 8中,为什么对新表达式的类型推断会导致可为空的引用?,c#,c#-8.0,nullable-reference-types,C#,C# 8.0,Nullable Reference Types,如果我有C 8代码: class Foo {} 后来: #nullable enable var bar = new Foo(); 那么酒吧的类型是Foo?。这显然是不正确的,因为新表达式不能返回null。为什么bar是可为空的引用?我甚至查了一下,发现如下: 从不为空的表达式 以下表达式形式的null状态始终不为null: ... 新表达式对象、委托、匿名对象和数组创建表达式 ... 而且: var的类型推断 为使用var声明的局部变量推断的类型由初始化表达式的null状态通知 var x
class Foo {}
后来:
#nullable enable
var bar = new Foo();
那么酒吧的类型是Foo?。这显然是不正确的,因为新表达式不能返回null。为什么bar是可为空的引用?我甚至查了一下,发现如下:
从不为空的表达式
以下表达式形式的null状态始终不为null:
...
新表达式对象、委托、匿名对象和数组创建表达式
...
而且:
var的类型推断
为使用var声明的局部变量推断的类型由初始化表达式的null状态通知
var x = E;
如果E的类型是可为空的引用类型C?并且E的null状态不是null,那么为x推断的类型是C。否则,推断的类型是E的类型
根据var的注释上下文,如上所述确定为x推断的类型的可空性,就好像该类型是在该位置显式给定的一样
因此,根据我在规范中所能找到的一切,我非常简单的示例中的bar应该是Foo类型,而不是Foo?类型?。我遗漏了什么?如果var从表达式中推断其可空性,那么在许多情况下,您以后将无法为其分配空值。例如,var s=;。
曾讨论过允许var?表示类型的可空版本,但它有几个问题。常规变量是否会被限制为推断不可为null的类型
如果是的话,那么1由于用户需要添加更多内容,我们正在造成采纳的痛苦?注释,2我们已经发布的var模式的可空性不一致,3可空值类型int?存在一些问题?。
如果不是,那么代码的意图就不是很清楚了。变量?将清楚地指示可为null的类型,但var将是可为null和不可为null的混合体
推断var的可空类型的决定记录在中。如果var是从表达式推断其可空性,那么在许多情况下,您以后将无法为其分配null。例如,var s=;。
曾讨论过允许var?表示类型的可空版本,但它有几个问题。常规变量是否会被限制为推断不可为null的类型
如果是的话,那么1由于用户需要添加更多内容,我们正在造成采纳的痛苦?注释,2我们已经发布的var模式的可空性不一致,3可空值类型int?存在一些问题?。
如果不是,那么代码的意图就不是很清楚了。变量?将清楚地指示可为null的类型,但var将是可为null和不可为null的混合体
推断var的可空类型的决定记录在。如何获得基于OmniSharp插件的VS代码中的bar类型?Intellisense。是否有帮助?它有一个指向c设计说明的链接,该说明介绍了如何使用带有可空引用类型的var,这确实涵盖了它。我不完全同意他们的推理,但至少我能明白这是什么。你应该对此做出一个实际的回答。@MichaelPowell似乎你在文章中提供的C规范部分与下一部分相矛盾。请检查这个。它提供指向讨论和实现此行为的github页面的链接。如何获得bar的类型?基于OmniSharp插件的VS代码中的Intellisense。有帮助吗?它有一个指向c设计说明的链接,该说明介绍了如何使用带有可空引用类型的var,这确实涵盖了它。我不完全同意他们的推理,但至少我能明白这是什么。你应该对此做出一个实际的回答。@MichaelPowell似乎你在文章中提供的C规范部分与下一部分相矛盾。请检查这个。它提供了到github页面的链接,这些页面讨论并实现了这种行为。回答得好。我真的不同意这个逻辑,但我至少知道它是从哪里来的。回答得好。我真的不同意这个逻辑,但我至少知道它是从哪里来的。