为什么你不能在成员初始化器中使用'this'?

Ale*_*exC 54 c#

可能重复:
在成员初始化程序中不能使用'this'?

如果我尝试做这样的事情,为什么我会收到错误的任何想法:

public class Bar
{
    public Bar(Foo foo)
    {
    }
}

public class Foo
{
    private Bar _bar = new Bar(this);
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误说:

"不能在成员初始化程序中使用'this'"

但以下工作:

public class Foo
{
    private Bar _bar;

    public Foo()
    {
        _bar = new Bar(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

有谁知道这背后的原因?我的理解是这些会编译成同一个IL,所以很好奇为什么一个被允许而另一个不被允许.

谢谢,亚历克斯

Jon*_*eet 54

怀疑在至少基类构造函数运行之前阻止你使用该对象,确保所有基类成员都已正确初始化.(变量初始值设定项在基类构造函数之前执行,而构造函数体之后执行.)

当我接下来接近它时,将检查带注释的规范是否有任何关于此的说法...

编辑:C#4注释规范没有任何解释.只是(10.5.5.2):

实例字段的变量初始值设定项无法引用正在创建的实例.

  • 你当然是对的.我们应该将其添加到下一版注释规范中,这是一个很好的规范. (20认同)

Dar*_*rov 14

字段初始值设定项在基类构造函数之前运行,因此this尚不存在.只有在基础构造函数完成执行后才存在.

17.10.2实例变量初始值设定项:

当实例构造函数没有构造函数初始化程序,或者它具有形式为base(...)的构造函数初始值设定项时,该构造函数隐式执行由其类中声明的实例字段的变量初始值设定项指定的初始化.这对应于在进入构造函数之后和直接调用直接基类构造函数之前立即执行的赋值序列.变量初始值设定项以它们出现在类声明中的文本顺序执行.