Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C 8中,为什么对新表达式的类型推断会导致可为空的引用?_C#_C# 8.0_Nullable Reference Types - Fatal编程技术网

C# 在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

如果我有C 8代码:

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页面的链接,这些页面讨论并实现了这种行为。回答得好。我真的不同意这个逻辑,但我至少知道它是从哪里来的。回答得好。我真的不同意这个逻辑,但我至少知道它是从哪里来的。