2009-04-29 34 views
0

编译器错误 关键字“这个”不可用在目前情况下构造函数初始化不允许我使用“这个”

delegate void CallBack(int i); 
class A 
{ 
    public A(CallBack cb) { } 
} 
class B : A 
{   
    public B() : base(new CallBack(this.f)){} 

    private void f(int i) { } 
} 

这是为什么错误? 因为我认为在提供一个无参数的构造函数保护()的解决方案,并有

class B : A 
{ 
    public B() : base() // inherit the new A() ctor 
    { 
      base.cb = new CallBack(this.f); //this is allowed here 
    } 
    //... 
} 

回答

15

这是因为“这个”尚未建立,直到基类构造函数运行。 在你的第二个例子中,基础构造函数已经完成,现在“this”有意义。

1

在第一个示例中,B实例尚未初始化。第二,它是。

0

由于对象尚未(完全)构造,即基础构造函数尚未运行,因此this在此处不可用。

-1

您应该使用抽象/虚拟方法。

abstract class A { 
    A() { 
     this.Initialize(); 
    } 

    abstract void Initialize() { } 
} 

class B : A { 
    string Text; 

    B() { } 

    override void Initialize() { 
     this.Text = "Hello world"; 
    } 
} 
+0

你实际上是建议从构造函数调用一个虚拟方法? – 2009-04-29 13:44:38

+0

这可能是一个很好的模式,但“文本”应该在A中,因为正如您在我的pb中看到的,A也在回调中, 以及我给出的解决方案只使用ctors(没有初始值,所以没有用户混淆)。但thx 4解决方案。 – user89010 2009-04-29 14:24:06

+0

@Greg:是的,这是可能的解决方案之一。 @cataounfeldeszuzieq:“文本”可以在A或B中,这并不重要。源代码仅是可能情况之一的示例。 012lk @unknown:请告诉我,为什么我得到一个负面的观点。这对我和其他人来说都是有用的。谢谢。 – TcKs 2009-04-29 14:41:10