2014-01-29 2 views
-1

안녕하세요. 혼란스러운 제목으로 유감스럽게 생각합니다. 내가하고 싶은 말을 제대로 표현할 수 없습니다. 질문에이 스 니펫을 어떻게 해석해야합니까?매개 변수없는 오버로드 된 생성자가 매개 변수화 된 호출자를 호출합니까?

public class Node 
{ 
    public long Id { get; private set; } 
    /// Creates a Node which has the supplied id. 
    public Node(long id) : this() 
    { 
     Id = id; 
    } 
/* */ 
} 

내가 잘못하지 않았다면; 노드가 매개 변수화 된 생성자로 생성 될 때 this 키워드는 동일한 메소드를 호출해야하지만 매개 변수없이 기본 (기본) 빈 생성자로 기본 설정해야합니다. 마지막에는 무의미한 빈 기본 생성자를 호출하는 또 다른 방법 인 것처럼 보입니다. 그리고 대신 생성자가 의도 한대로 작동한다면 Id 멤버를 어떻게 인스턴스화 할 수 있습니까?

전체 소스 코드는 여기에 있습니다 : http://sourceforge.net/p/satsumagraph/code/ci/master/tree/src/Graph.cs#l38 실제 코드에서

+2

현재 코드에 기본 생성자 * (매개 변수 less) *가 없으므로 'Node'에 0 개의 인수를 사용하는 생성자가 포함되어 있지 않습니다. – Habib

+1

코드가 실제 코드가 아닙니다. 표시 할 수 있습니까? 실제, 실제 코드? –

+0

Graph.cs 클래스의 실제 코드는 Node가 클래스가 아니라 구조체임을 보여줍니다. http://sourceforge.net/p/satsumagraph/code/ci/master/tree/src/Graph.cs –

답변

6

Nodestruct 아닌 클래스입니다.

이 경우 기본 생성자에 대한 호출을 추가해야합니다. 이를 사용하지 않으면 값 유형에 자동 속성을 사용하기 때문에 개체가 "해당 필드가 모두 할당되기 전에는 사용할 수 없습니다"라는 메시지가 나타납니다. 이것은 컴파일러에서 배킹 필드를 추가하고 해당 필드에 초기화되기 전에 해당 필드에 액세스해야하기 때문입니다. 생성자가 필드를 초기화하기 전에 속성을 설정하려고합니다. 모든 struct에는 기본 생성자가 포함되어 있으며이를 호출하여 자동 속성의 백업 필드를 "제로 - 초기화"하여 올바르게 작동하게합니다.

class으로 설명했듯이이 작업은 불필요 할뿐만 아니라 컴파일도되지 않습니다.

+0

완벽, 그건 결국 내 독서 잘못 이었어. 설명 주셔서 감사합니다! – Harter

0

msdn에 따르면 : - 당신은 위의 코드를 컴파일 할 때 당신이 매개 변수가없는 생성자를 정의하지 않았기 때문에

A constructor can invoke another constructor in the same object by using the this keyword. Like base, this can be used with or without parameters, and any parameters in the constructor are available as parameters to this, or as part of an expression.

, 그것은 당신에게 오류를 제공해야합니다. 따라서

, 당신이 할 때 : - 당신은 당신이 정의되지 않은 매개 변수가없는 생성자를 호출하려고

public Node(long id) : this() 
    { 
     Id = id; 
    } 

.

관련 문제