internal 클래스를 이용 할 때 발생할 수 있는 오류이다.

일관성 없는 액세스 가능성 : 'namespaceA.InternalClass' 속성 형식이 'namespaceB.PublicClass.ProtectedProperty' 속성보다 액세스하기 어렵습니다.

namespace A 에 internal class 를 선언하고, 해당 internal class 를 friend dll B 에서 이용한다고 하자.

그러면 B 의 public class 에서는 A 의 internal class 를 이용 할 수 있지만, 그 프로퍼티가 protected 이면 일관성 없는 액세스 가능성 오류가 발생한다.

왜? protected 는 internal 보다 좁지만 넓은 한정자이기 때문이다. Protected 속성은 해당 dll 내에서는 internal 보다 좁지만, 다른 dll 을 넘나들며 상속되면 이야기가 달라진다. 위의 public class 가 다른 dll C 에서 상속 되면 protected property 가 C 에서도 보이게 된다. 그런데 C 는 B 와 달리 A 의 friend dll 이 아니므로 A 의 internal 클래스를 볼 수 없다. 따라서 일관성 없는 액세스 가능성 오류가 나타나는 것이다.


나는 unit test project 를 위의 dll B 역할로 생성하다가 문제를 만났다. 결국 해결책은 internal class 를 public class 로 바꾸는 수 밖에 없었다.

참고로 protected internal 키워드는 and 가 아니라 or 개념이다. protected 이거나, 또는 internal 이거나. 따라서 위에서 super class 의 protected property 를 다른 dll 의 drived class 에서 보지 못하도록 하는 방법은 없다. 아마도 C# 언어 설계팀은 internal class 를 friend class 에서 protected property 로 사용하는 상황을 설계 오류로 생각했을 것 같다. 아니면 너무 예외적인 상황이라 개발비용을 투입할 필요를 못느꼈거나.