2009-04-29 4 views
0

컴파일러 오류 키워드 'this'는 현재 컨텍스트에서 사용할 수 없습니다.생성자 이니셜 라이저에서 'this'를 사용할 수 없습니다.

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

이 오류는 왜입니까? 솔루션으로 나는 A()에서 매개 변수없는 보호 ctor를 제공하고

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

실제로 생성자에서 가상 메서드를 호출하는 것이 좋습니다? –

+0

이것은 따라야 할 좋은 패턴 일 수 있지만 "텍스트"는 내 pb에서 볼 수 있듯이 A가 콜백 인 도 포함하고 있기 때문에 내가 제공 한 솔루션도 ctors 만 사용합니다 (초기화자가 없으므로 혼란을 사용자에게). 그러나 thx 4 솔루션. – user89010

+0

@ 그렉 : 예, 가능한 해결책 중 하나입니다. @cataounfeldeszuzieq : "텍스트"는 A 또는 B 일 수 있습니다. 중요하지 않습니다. 소스 코드는 가능한 상황 중 하나의 샘플이었습니다. @unknown : 왜 부정적인 점이 있는지 말해주십시오. 나와 다른 사람들에게 유용 할 것입니다. 감사. – TcKs

관련 문제