2009-04-29 14 views
0

Compilerfehler Schlüsselwort ‚this‘ zu verwenden, ist im aktuellen Kontext nicht verfügbarConstructor initializer erlaubt mir nicht, ‚dieses‘

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) { } 
} 

Warum ist dieser Fehler? Als Lösung, die ich dachte, einen parameter geschützt Ctor in A() die Bereitstellung und

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

Antwort

15

hat Es ist, weil „dies“, bis der Basisklassenkonstruktor ausgeführt wird nicht erstellt wurde. In Ihrem zweiten Beispiel wurde der Basiskonstruktor beendet, und nun hat "das" Bedeutung.

1

Im ersten Beispiel ist die B-Instanz noch nicht initialisiert. In der zweiten ist es.

0

Da das Objekt noch nicht (vollständig) konstruiert ist, wurde der Basiskonstruktor noch nicht ausgeführt, this ist dort nicht verfügbar.

-1

Sie sollten eine abstrakte/virtuelle Methode verwenden.

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

    abstract void Initialize() { } 
} 

class B : A { 
    string Text; 

    B() { } 

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

Sie empfehlen eigentlich, eine virtuelle Methode von einem Konstruktor aufzurufen ?? –

+0

Dies kann ein schönes Muster sein, aber "Text" sollte in A sein, da A auch in meinem Callback steht, und auch die Lösung, die ich gab, verwendet nur ctors (keine Initialisierer, also nein Verwirrung für den Benutzer). Allerdings thx 4 Lösung. – user89010

+0

@Greg: Ja, das ist eine der möglichen Lösung. @cataounfeldeszuzieq: Der "Text" kann in A oder B sein, es ist nicht wichtig. Der Quellcode war nur ein Beispiel für eine der möglichen Situationen. @unknown: Bitte sagen Sie mir, warum ich einen negativen Punkt bekam. Es wird für mich und andere nützlich sein. Vielen Dank. – TcKs

Verwandte Themen