2010-11-21 3 views
2


다음 코드를 사용하면 inconsisteng 접근성을 계속보고하지만 이유를 이해할 수 없습니다. 이 프로그램 클래스의 존재 여부가 공개되는에 따라 달라집니다 : 당신은 당신의 열거 선언에 액세스 한정자를 넣어하지 않은, 그리고 당신이 당신의 Program 클래스의 public 필드로 노출되어열거 형 및 공용 클래스와의 혼동 - 왜 작동하지 않습니까?

enum Test 
    {A,B} 

    public class Program //when I remove public, it works 
    { 
     public Test a = Test.A; 

     static void Main(string[] args) 
     { 

     } 
    } 

답변

2

에 열거를 설정해야합니다 (예. public, protected, internal) 당신의 열거에, 그것은 클래스 internal 인 디폴트 값 (소요 열거 형). 그런 다음 열거 형을 어셈블리 외부에 표시 할 수 없으므로 Program 클래스의 public 필드를 통해 해당 열거 형을 노출합니다.

열거 형을 public으로 선언하거나 필드의 액세스 한정자를 internal 또는 private으로 변경해야합니다.

Program 클래스가 Program 클래스를 열거 형과 같게 변경하기 때문에 클래스에서 public을 제거하면 작동합니다. 어느 누구도 공개적으로 노출되지 않아서 괜찮습니다.

+0

그래,하지만 왜 프로그램 클래스의 액세스 수정자를 이해하지 못합니다. – Loj

+0

오, 알았어. 왜냐하면 다른 어셈블리가 공용 프로그램 클래스에 액세스 할 수 있고 공용 필드에서 열거 형을 노출하기 때문입니다. 그러나 열거 형 자체는 개인용입니다 (내부도 마찬가지입니다). – Loj

+0

@Mojmi : 예, 맞습니다. 클래스 필드의 액세스 가능성은 클래스의 액세스 가능성에 의해 무시됩니다. 예. 클래스가'internal'이고'public' 필드를 가지고있는 경우, 클래스는 클래스에 대한 액세스를 제한하기 때문에 공개적으로 액세스 할 수 없습니다. – adrianbanks

4

. 액세스 한정자를 선언하지 않으면 private입니다.

public enum Test { A, B } 
+0

감사합니다 ... 속성? Program 클래스의 분야라고 생각합니다. 그러나 수업이 비공개 일 때 왜 효과가 있습니까? – Loj

+0

좋은 지적, 그 분야. 클래스가'private' 일 때 그것은 열거 형과 같은 접근성 레벨을 가지므로'public' 필드는 그것이 포함 된 클래스의 접근 수정 자에 의해 여전히 제한됩니다. –

+1

'private'가 아니며'internal'입니다. . 다른 유형의 회원이 아니라면. – configurator

2

enum이 비공개이므로이 속성을 public으로 설정할 수 없습니다. 공개 속성은 누군가가 당신의 프로그램을 사용하고 컴파일러가 당신에게 그것에 대해 알려주면 외부 공개 일 것입니다. 당신이 명시 적으로 액세스 한정자를 선언하지 않았기 때문에

+0

나는 이해하지 못한다. 클래스가 비공개 인 경우 작동합니다. 클래스 선언에 "public"을 추가하면 작동하지 않습니다. 그리고 왜 당신은 그것을 재산이라고 부릅니까? 필드가 아닌가요? – Loj

+0

혼란에 대해 유감스럽게 생각합니다. 필드/속성은 공용 열거 형, 구조체 및 클래스 만 공개 (공개) 할 수 있으므로 열거 형을 public으로 선언해야합니다. – mhenrixon

1

당신은 아마 대중