为什么不能在成员初始化程序中使用“ this”? [重复]

问题描述

|                                                                                                                   这个问题已经在这里有了答案:                                                      

解决方法

我怀疑这是要防止您至少在基类构造函数运行之前使用该对象,以确保所有基类成员都已正确初始化。 (变量初始化器在基类构造函数之前执行,而构造函数主体在此之后执行。) 当我靠近它时,将检查带注释的规范是否对此有话要说... 编辑:C#4注释的规范没有任何解释。只是(在10.5.5.2中):   实例字段的变量初始化器无法引用正在创建的实例。     ,字段初始化程序在基类构造函数之前运行,因此
this
尚不存在。它仅在基本构造函数完成执行后才存在。 17.10.2实例变量初始化器:   当实例构造函数没有   构造函数初始值设定项,或者具有   形式的构造方法初始值设定项   base(...),该构造函数隐式   执行指定的初始化   通过变量的初始化   在其类中声明的实例字段。   这对应于   执行的作业   进入后立即   构造函数和隐式函数之前   直接基类的调用   构造函数。变量   初始化程序在   它们出现的文字顺序   类声明。     ,我相信这是因为字段在类初始化之前初始化,因此在运行以下代码时:
private Bar _bar = new Bar(this);
\“ this \”没有要引用的实际值。 虽然将其放在构造函数中意味着存在一个可由“ this \”引用的\“ Foo \”实例     ,成员初始化程序在类构造函数之前运行。考虑到您可能在一个类中有许多成员初始化器。 如果在构造函数中使用\'this \'->所有带有初始化程序的成员都将被初始化。所以一切都很好。 如果在成员初始化程序中使用\'this \':其他成员(已附加初始化程序)可能尚未初始化-> \'this \'尚未准备好。这就是为什么在这里不允许使用\'this \'的原因。     ,在C#中,没有逻辑要放在方法和属性的主体之外。 字段初始化程序是一个例外,但有一些限制。 使用该关键字获取当前对象的引用是错误的,因为类字段声明不是逻辑而是类设计,而这是运行时语义的一部分。 顺便说一句,这似乎是C#的设计决定,因为实际上,在类构造期间运行了字段初始化程序,因此“通过此类声明当前实例”应该可用。但是,这又超出了方法或属性主体范围? 正如Jon Skeet和其他人指出的那样,这是不可用的,因为字段初始化程序是在基本构造函数执行之后执行的。