为什么`this`在C#6.0自动属性初始化中不可用?

卢克·沃(Luke Vo):

我有以下代码类:

public class Foo
{
    public Nested Bar { get; } = new Nested(this);

    public class Nested
    {
        public Nested(Foo foo)
        {
            foo.DoSomething();
        }
    }

    private void DoSomething()
    {

    }
}

但是,出现此编译错误:

关键字“ this”在当前上下文中不可用

我可以通过不使用自动属性初始化程序来对其进行修复,而应将其显式移动到构造函数中:

public Nested Bar { get; }

public Foo()
{
    this.Bar = new Nested(this);
}

为什么会这样呢?自动属性初始化程序实际上不是转换为IL中的构造函数代码吗?

马克·格雷夫(Marc Gravell):

简单:您不能this在初始化程序中使用这样做的目的是防止逃逸不完整的对象- Nested(this)可能对对象造成任何影响,从而导致非常混乱且难以理解的错误。请记住,初始化程序要在您添加的任何构造函数之前执行对于字段初始化器,同样的事情也会以相同的方式失败:

private Nested _field = new Nested(this);

本质上,初始化器旨在执行简单的初始化-解决了98%的问题。任何涉及到的事情this都更加复杂,您需要编写自己的构造函数-并为任何计时问题负责:)

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Python

为什么是Python 3.6.1。pyenv中不可用?

来自分类Dev

为什么无符号整数在PostgreSQL中不可用?

来自分类Dev

初始化C#自动属性

来自分类Java

为什么@HeadMapping在Spring MVC中不可用?

来自分类Dev

什么是C#6中(建议的)“记录”类?

来自分类Dev

为什么NPM在Docker容器中不可用

来自分类Dev

为什么原型在简单的JavaScript对象中不可用

来自分类Dev

新的C#6对象初始化程序语法?

来自分类Dev

为什么在C#6中删除声明表达式?

来自分类Dev

C#6中(自动)属性初始化语法之间的区别

来自分类Dev

为什么没有捕获的lambda从C#5中的静态更改为C#6中的实例方法?

来自分类Dev

如何在C#6中的类上初始化属性

来自分类Dev

C#4中的C#6 nullcheck扩展

来自分类Dev

C#6:getter / setter中的nameof()当前属性

来自分类Dev

ResponseType在MVC 6中不可用

来自分类Dev

C#6自动初始化属性和支持字段的使用

来自分类Dev

为什么以及何时malloc()在C中不可用?

来自分类Dev

当当前项目中的等效结构不可用时,为什么可以访问由单独项目提供的未初始化结构?

来自分类Dev

为什么隐式类中的函数不可用?

来自分类Dev

为什么只有自动实现的属性才能在C#中具有初始化程序?

来自分类Dev

为什么“共享按钮”在Ubuntu One中不可用?

来自分类Dev

为什么在此示例中变量范围不可用

来自分类Dev

C#中的属性初始化

来自分类Dev

JSONJoy协议的Swift初始化方法不可用作Objective-C选择器

来自分类Dev

C#6中的静态属性

来自分类Dev

为什么别名在 /etc/profile 中不可用?

来自分类Dev

为什么非静态类的静态属性在剃刀视图 MVC 中不可用

来自分类Dev

为什么 SparkSession 在 Spark2.3 中不可用

来自分类Dev

为什么 Groovy 的日期扩展在 Micronaut 中不可用?

Related 相关文章

  1. 1

    为什么是Python 3.6.1。pyenv中不可用?

  2. 2

    为什么无符号整数在PostgreSQL中不可用?

  3. 3

    初始化C#自动属性

  4. 4

    为什么@HeadMapping在Spring MVC中不可用?

  5. 5

    什么是C#6中(建议的)“记录”类?

  6. 6

    为什么NPM在Docker容器中不可用

  7. 7

    为什么原型在简单的JavaScript对象中不可用

  8. 8

    新的C#6对象初始化程序语法?

  9. 9

    为什么在C#6中删除声明表达式?

  10. 10

    C#6中(自动)属性初始化语法之间的区别

  11. 11

    为什么没有捕获的lambda从C#5中的静态更改为C#6中的实例方法?

  12. 12

    如何在C#6中的类上初始化属性

  13. 13

    C#4中的C#6 nullcheck扩展

  14. 14

    C#6:getter / setter中的nameof()当前属性

  15. 15

    ResponseType在MVC 6中不可用

  16. 16

    C#6自动初始化属性和支持字段的使用

  17. 17

    为什么以及何时malloc()在C中不可用?

  18. 18

    当当前项目中的等效结构不可用时,为什么可以访问由单独项目提供的未初始化结构?

  19. 19

    为什么隐式类中的函数不可用?

  20. 20

    为什么只有自动实现的属性才能在C#中具有初始化程序?

  21. 21

    为什么“共享按钮”在Ubuntu One中不可用?

  22. 22

    为什么在此示例中变量范围不可用

  23. 23

    C#中的属性初始化

  24. 24

    JSONJoy协议的Swift初始化方法不可用作Objective-C选择器

  25. 25

    C#6中的静态属性

  26. 26

    为什么别名在 /etc/profile 中不可用?

  27. 27

    为什么非静态类的静态属性在剃刀视图 MVC 中不可用

  28. 28

    为什么 SparkSession 在 Spark2.3 中不可用

  29. 29

    为什么 Groovy 的日期扩展在 Micronaut 中不可用?

热门标签

归档