2009-03-25 2 views
3

왜 ClassA의 첫 번째 생성자가 '멤버 초기화 프로그램에서'이 '를 사용할 수 없습니까?'라는 컴파일러 오류가 발생합니까?"this"로 체인 생성자

... 또는 어떻게 작동합니까? 그러나,이 맥락에서 this (현재 인스턴스)를 사용할 수 없습니다 -

감사

public sealed class ClassA : IMethodA 
{ 
    private readonly IMethodA _methodA; 

    public ClassA():this(this) 
    {} 

    public ClassA(IMethodA methodA) 
    { 
     _methodA = methodA; 
    } 

    public void Run(int i) 
    { 
     _methodA.MethodA(i); 
    } 

    public void MethodA(int i) 
    { 
     Console.WriteLine(i.ToString()); 
    } 
} 

public interface IMethodA 
{ 
    void MethodA(int i); 
} 

답변

1

당신은 this 키워드를 사용할 수 없습니다 (객체의 생성이 시작되지 않는 일부 (최상위 또는 기본까지) 생성자 블록이 입력되었습니다. 게다가, 왜 정확히 이것을하고 싶습니까? 어디 에나 this 키워드에 대한 액세스 권한이있는 경우 무의미한 것처럼 보입니다.

단순히 같은 독립적 인 생성자를 사용하는 것이 좋습니다 :

public sealed class ClassA : IMethodA 
{ 
    private readonly IMethodA _methodA; 

    public ClassA() 
    { 
     _methodA = this; 
    } 

    public ClassA(IMethodA methodA) 
    { 
     _methodA = methodA; 
    } 
} 

는 아마도 내가 당신이해야 할 노력하고, 그러나 희망이 당신을 위해 문제를 해결할 것입니다 무슨 오해.

9

동일한 수준에서 다른 생성자를 호출 할 this(...) 구문을 사용할 수 있습니다.

가장 쉬운 옵션은 여기에 할당 코드 (_methodA = methodA)를 복제하는 것입니다.

또 다른 옵션은 null로 병합 할 수 있습니다 가 만든 되는 인스턴스에 액세스 할 수 없습니다

public ClassA():this(null) 
{} 

public ClassA(IMethodA methodA) 
{ // defaults to "this" if null 
    _methodA = methodA ?? this; 
} 
+0

@Marc Gravell : 저를 때려주십시오 ... –

3

이하는 것은은 C# 사양

인스턴스 생성자 초기화 섹션 10.11.1에서 호출 . 간단한 이름을 인스턴스 부재를 참조 인수 발현 그것을 컴파일시에 오류를 그대로 따라서는 생성자 초기화의 인자 발현이 를 참조하는 컴파일시에 오류이다.

액세스 할 수 없으므로 인스턴스 생성자와 함께 사용할 수있는 방법이 없습니다. 당신이 할 수있는 일은 생성자를 private으로 만들고, 초기화 메소드와 정적 생성자를 생성하는 것입니다.

public sealed class ClassA : IMethodA {  
    private ClassA() { } 
    private void Initialize(IMethodA param) { ... } 
    public static ClassA Create() { 
    var v1 = new ClassA(); 
    v1.Initialize(v1); 
    return v1; 
    } 
    public static ClassA Create(IMethodA param) { 
    var v1 = new ClassA(); 
    v1.Initialize(param); 
    return v1; 
    } 
} 
3

개체가 생성되기 전에 전달하려고합니다. 컴파일러는이 경우 합리적인 것을 할 수 있지만 일반적으로 작동하지 않습니다. 그냥 이렇게하면

귀하의 실제 예제는 작동 :

public ClassA() 
    { 
    _methodA = this; 
    } 

을하지만 당신은 아마 그래서 그냥 함수를 사용하여 더 논리를 공유하고 싶습니다. 기본적으로 생성자 체인 때 this 아직 인스턴스화되지 않은 객체를 참조하기 때문에

public ClassA() 
    { 
    SetStuff(); 
    _methodA = this; 
    } 

    public ClassA(IMethodA methodA) 
    { 
    SetStuff(); 
    _methodA = methodA; 
    } 
+0

'ref' /'out' 인수를 사용하면 * 읽기 * 필드에 SetStuff를 사용할 수 있습니다. 가치가 있는지 여부는 시나리오에 따라 다릅니다. –