http://pullthelever.tistory.com/332






- Case 1

class A
{
   b;       //당연히 된다.
   B.c;    //클래스 B 안에 클래스 C가 public이므로 가능하다.
                 //public이 아니면 아래와 같은 오류가 나온다.
                 //오류 CS0122: 보호 수준 때문에 '_namespace.B.C'에 액세스할 수 없습니다.

}

class B
{
    public class C//public말고도 private, protected도 가능하다.
    {
       //...
    }
}



- Case 2
class A          //기본으로 internal이다.
{
   //...
}

public class B//private, protected는 못 오고 internal, public만 올 수 있다.
{
   public a;
// 오류 CS0052: 일관성 없는 액세스 가능성:
// '_namespace.A' 필드 형식이 '_namespace.B.a' 필드보다 액세스하기 어렵습니다.

   public func1() { return a; }
// 오류 CS0050: 일관성 없는 액세스 가능성:
// '_namespace.A' 반환 형식이 '_namespace.B.func1()' 메서드보다 액세스하기 어렵습니다.

   public void func2(a) { this.a = a; }
// 오류 CS0051: 일관성 없는 액세스 가능성:
// '_namespace.A' 매개 변수 형식이 '_namespace.B.func2(_namespace.A)' 메서드보다
//  액세스하기 어렵습니다.
}


- 이유
   A는 internal로 외부로 공개되지 않았는데 외부로 공개하는 B에서 A를 외부로 공개하려고 하니 오류가 발생한다.

- Case 2 처방전
첫 번째 방법)
   class 를 public class A로 바꾼다

두 번째 방법)
   public class B를 class B로 바꾼다

세 번째 방법)
   public a, public func1(), public void func2(a) 
   a, func1(), void func2(a) 로 바꾼다

- public과 internal란
public으로 선언된 경우 다른 어셈블리에서도 접근할 수 있다.
internal으로 선언된 경우 동일한 어셈블리의 파일 내에서만 접근할 수 있다.
아무것도 안 넣으면 internal이다.


반응형

+ Recent posts