为什么你不能在成员初始值设定项中使用“this”?
可能重复:
在成员初始值设定项中不能使用'this'?
任何想法,为什么我得到一个错误,如果我尝试做这样的事情:
public class Bar { public Bar(Foo foo) { } } public class Foo { private Bar _bar = new Bar(this); }
我得到一个错误说:
“在成员初始化器中不能使用'这个'
但是下面的作品:
public class Foo { private Bar _bar; public Foo() { _bar = new Bar(this); } }
任何人都知道这背后的原因? 我的理解是,这些会汇编成同一个IL,所以好奇为什么一个是允许的,另一个不是。
谢谢,Alex
我怀疑这是为了防止你至less在基类构造函数运行之前使用这个对象,确保所有的基类成员都被适当的初始化。 (variables初始化器是在基类构造函数之前执行的,而构造函数体是在那之后执行的。)
当我下一个附近时,将检查注释的规范是否有什么要说的…
编辑:C#4注释规范没有任何解释。 只是(在10.5.5.2):
实例字段的variables初始值设定项不能引用正在创build的实例。
字段初始值设定项在基类构造函数之前运行,所以this
还不存在。 只有基础构造函数完成执行后才存在。
17.10.2实例variables初始值设定项 :
当一个实例构造函数没有构造函数初始值设定项,或者它有一个forms为base(…)的构造函数初始值设定项时,该构造函数隐式地执行由在其类中声明的实例域的variables初始值设定项指定的初始值。 这对应于在进入构造函数时和直接基类构造函数的隐式调用之前立即执行的赋值序列。 variables初始值设定项按它们出现在类声明中的文本顺序执行。
我相信这是因为字段初始化之前,类初始化所以当下面的代码运行:
private Bar _bar = new Bar(this);
“这个”没有实际的参考价值。
把它放在构造函数中意味着有一个“Foo”实例可以被“this”引用,
成员初始化器在类构造函数之前运行。 考虑你可能在一个类中有许多成员初始值设定项。
如果在构造函数中使用“this” – >所有具有初始值设定项的成员都被初始化了。 所以一切都好。
如果您在成员初始化程序中使用“this”:其他成员(附有初始化程序)可能尚未初始化 – >“this”尚未准备好。 这就是为什么在这里不允许使用“this”是不允许的。
在C#中,没有逻辑意图是在方法和属性的外部。
字段初始值设定项是一个例外,但有一些限制。
使用这个关键字获取当前对象的引用是错误的,因为类字段声明不是逻辑而是类devise,而这是运行时语义的一部分。
顺便说一下,它似乎是一个C#devise的决定, 因为实际上,一个字段初始化器在类的构造过程中运行,所以“当前声明类的实例”应该可以通过这个 。 但是,在方法或财产主体范围之外呢,又是什么呢?
正如Jon Skeet和其他人指出的, 这是不可用的,因为字段初始化器是在基本构造器执行之后执行的。