2013-03-28 4 views
0

확장 메소드가 아무 관계가 없기 때문에 제 질문을 단순화했습니다.정적 필드를 초기화하지 못했습니다.

class MyClass 
{ 
    private static readonly char[] InvalidChars = new []{'\\', '/'}; 


    public MyClass() 
    { 
     if (InvalidChars == null) 
     { 
      //how can this block be accessable? 
     } 
    } 

} 

내 질문은 :이 MyClass의 생성자에 액세스 할 때 InvalidChars가 null을 반환 할 수있는 모든 시나리오가 여기에

는 코드인가? 분명히 거기에 있습니다, 왜냐하면 내가 본인의 응용에서 보았던 것이기 때문입니다. 나는 그 가능성을 이해하지 못한다.

+5

제공된 코드는 귀하가 설명한 예외를 발생시키지 않습니다. MyClass 생성자를 호출 한 짧지만 완전한 프로그램을 작성했지만 괜찮습니다. 질문을 수정하여 문제를 나타내는 코드를 표시하십시오. 그렇지 않으면 진단 할 수 없습니다. –

+0

/MyClass는 어디에서 인스턴스화합니까? 이것은 확장 메서드가 전혀 보이지 않습니다. –

+0

"SomeName"이 (가) 이름 Proeprty에 할당되어 있는지 확인 하시겠습니까? 이름이 null이거나 invalidchars라고 가정합니다. 또한 중단 점을 설정하고 디버거를 시작하십시오. –

답변

0

Ohoho, 죄송합니다. 전화 스택을주의하여 살펴본 후 문제를 발견했습니다. 당신이 옳았다. 나의 코드 예제는 완전하지 않았다. 완전한 버전은 다음과 같습니다.

class MyClass 
{ 
    private static readonly MyClass Default = new MyClass(); 
    private static readonly char[] InvalidChars = new []{'\\', '/'}; 


    public MyClass() 
    { 
     if (InvalidChars == null) 
     { 
     //how can this block be accessable? 
     } 
    } 

} 

당연히 null이 발생했습니다.

0

정적으로 표시 했으므로 읽기 전용 변수는 클래스의 정적 생성자에서만 초기화 할 수 있습니다. 에서, 을 필드 선언을 포함하거나 정적 필드 클래스의 인스턴스 생성자, 인스턴스 필드 들어

public readonly int y = 5; 

: 변수는, 예를 들어, 선언에 초기화

필드 선언이 포함 된 클래스의 정적 생성자 이들은 또한 읽기 전용 필드를 out 또는 ref 매개 변수로 전달할 수있는 유일한 컨텍스트입니다.

따라서 선언에서 static 키워드를 제거하면 생성자에서 변수를 초기화 할 수 있습니다.

+0

정적 생성자가 동일한 예외를 발생시킵니다. 내가 거기에 중단 점을 설정하면 - 나는 그것이 결코 호출되지 않는다는 것을 알 수 있습니다. 그리고 네,이 필드를 비 정적으로 만들면 모든 것이 잘 작동합니다. 그러나 여기서의 질문은 왜, 어떻게가 아니라입니다. –

관련 문제