在C#8中,为什么对新表达式进行类型推断会导致可为空的引用?

迈克尔·鲍威尔

如果我有C#8代码:

class Foo {}

然后:

#nullable enable
var bar = new Foo();

然后的类型barFoo?这显然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?我想念什么?

朱利安·库弗勒(Julien Couvreur)

如果var要从表达式中推断出它的可空性,那么在许多情况下,您以后将无法为其分配a null例如,var s = "";进行了讨论以允许var?表达“该类型的可为空的版本”,但是它有几个问题。var限制常规来推断非空类型吗?

如果是,则(1)由于用户需要添加更多?批注,我们正在造成采用上的痛苦;(2)我们已经使用的var模式的可空性不一致;(3)带有可空值类型的某些问题(int?)。如果否,那么代码的意图将不是很清楚。var?会明确指出可为空的类型,但var会混合包含可为空和不可为空的类型。

从2019年12月18日开始varLDM注释中记录了推断可空类型的决定

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#8可为空和不可为空的引用类型-仅当输入为可为空时才可为可输出

来自分类Dev

为什么以及额外的括号会如何更改C ++(C ++ 11)中的表达式类型?

来自分类Dev

Haskell中的表达式评估:修复子表达式的类型会导致对父表达式进行不同程度的评估

来自分类Dev

为什么我的正则表达式会导致无限循环?

来自分类Dev

为什么在此表达式中用括号替换美元符号($)会导致错误?

来自分类Dev

为什么返回此lambda表达式会导致字符串?

来自分类Dev

有关C#8可为空的引用类型的信息是否存储在.NET程序集中?

来自分类Dev

为什么我没有收到有关在C#8中使用结构的类成员可能会取消引用null的警告?

来自分类Dev

当在c#8中使用子类约束时,如何指定泛型引用类型为可为空?

来自分类Dev

C#8中的不可为空的引用类型在运行时可以为null吗?

来自分类Dev

使用泛型的C#8可为空的引用类型处理中的行为不一致

来自分类Dev

如何允许C#8中的可为空的泛型类型作为方法的返回类型?

来自分类Dev

开关表达式中的多个语句:C#8

来自分类Dev

C#8不可为空的引用和隐式用法

来自分类Dev

C#8开关表达式:找不到用于开关表达式的最佳类型

来自分类Dev

C#8开关内的表达式

来自分类Dev

将C#8可为空的引用类型标记为“这不能为空”

来自分类Dev

在C#8中的System.Type上切换表达式

来自分类Dev

无效方法的C#8开关表达式

来自分类Dev

为什么此表达式会导致SQL错误?

来自分类Dev

不可为空的引用类型:为什么编译器认为我的对象可为空?

来自分类Dev

C#8可为空和不可为空的引用类型-仅当输入为可为空时才可为可输出

来自分类Dev

具有C#8可为空的引用类型的TryGetValue模式

来自分类Dev

类型推断导致空引用

来自分类Dev

为什么GNU的“-或”标志会导致我的表达式以意外的方式求值?

来自分类Dev

为什么我的正则表达式会导致无限循环?

来自分类Dev

为什么在此表达式中用括号替换美元符号($)会导致错误?

来自分类Dev

使用 Protege 上的类表达式进行类型推断

来自分类Dev

为什么在 lamda 表达式中读取数组会导致错误?

Related 相关文章

  1. 1

    C#8可为空和不可为空的引用类型-仅当输入为可为空时才可为可输出

  2. 2

    为什么以及额外的括号会如何更改C ++(C ++ 11)中的表达式类型?

  3. 3

    Haskell中的表达式评估:修复子表达式的类型会导致对父表达式进行不同程度的评估

  4. 4

    为什么我的正则表达式会导致无限循环?

  5. 5

    为什么在此表达式中用括号替换美元符号($)会导致错误?

  6. 6

    为什么返回此lambda表达式会导致字符串?

  7. 7

    有关C#8可为空的引用类型的信息是否存储在.NET程序集中?

  8. 8

    为什么我没有收到有关在C#8中使用结构的类成员可能会取消引用null的警告?

  9. 9

    当在c#8中使用子类约束时,如何指定泛型引用类型为可为空?

  10. 10

    C#8中的不可为空的引用类型在运行时可以为null吗?

  11. 11

    使用泛型的C#8可为空的引用类型处理中的行为不一致

  12. 12

    如何允许C#8中的可为空的泛型类型作为方法的返回类型?

  13. 13

    开关表达式中的多个语句:C#8

  14. 14

    C#8不可为空的引用和隐式用法

  15. 15

    C#8开关表达式:找不到用于开关表达式的最佳类型

  16. 16

    C#8开关内的表达式

  17. 17

    将C#8可为空的引用类型标记为“这不能为空”

  18. 18

    在C#8中的System.Type上切换表达式

  19. 19

    无效方法的C#8开关表达式

  20. 20

    为什么此表达式会导致SQL错误?

  21. 21

    不可为空的引用类型:为什么编译器认为我的对象可为空?

  22. 22

    C#8可为空和不可为空的引用类型-仅当输入为可为空时才可为可输出

  23. 23

    具有C#8可为空的引用类型的TryGetValue模式

  24. 24

    类型推断导致空引用

  25. 25

    为什么GNU的“-或”标志会导致我的表达式以意外的方式求值?

  26. 26

    为什么我的正则表达式会导致无限循环?

  27. 27

    为什么在此表达式中用括号替换美元符号($)会导致错误?

  28. 28

    使用 Protege 上的类表达式进行类型推断

  29. 29

    为什么在 lamda 表达式中读取数组会导致错误?

热门标签

归档