【发布时间】:2015-07-28 14:26:10
【问题描述】:
为什么在定义实例变量时,编译器会在初始化实例变量时给出 this 不可用的错误?
关键字“this”在当前上下文中不可用
构造函数初始化没问题。我了解这里的情况 - 我只是想找到原因(通过 MSDN 或其他方式)为什么“this”可用于构造函数,但如果初始化成员变量则不能直接使用。
这是我看到的错误的简单抽象。
public class ClassA
{
// Gets compiler error that "this" unavailable
protected ClassB _a1 = new ClassB(this);
// Works fine
protected ClassB _a2;
public ClassA() { _a2 = new ClassB(this); }
}
public class ClassB
{
public ClassA A { get; private set; }
public ClassB(ClassA a) { this.A = a; }
}
我希望将我的初始化保留在分配旁边,因为上面的示例是我的代码的抽象,其中我为 10-15 个成员变量定义了惰性 valueFactory 委托,其中委托需要将数据上下文作为参数传递给构造函数。对于 15 个成员变量,我更愿意将赋值保留在定义旁边的一行上,而不是在 15 行定义中,然后在构造函数中再用 15 行来初始化每个变量。
这基本上是我在实际代码中必须做的:
public class MyContext
{
public ProgramService Programs { get { return _programs.Value; } }
protected Lazy<ProgramService> _programs;
public MyContext()
{
_programs = new Lazy<ProgramService>(() => new ProgramService(this));
}
}
【问题讨论】:
-
是否有可能在构造函数被命中之前初始化字段
-
你的问题的答案很好:stackoverflow.com/questions/6125247/…
-
虽然现在我看了一下,michalk references的问题可能更准确。
-
@michalk - 看起来 Jon Skeet 的答案正是原因 - 在带注释的 C# 规范中没有指定原因,只是不可能。
标签: c# initialization this