C# 4 仕様のセクション 3.5 から:
メンバーの宣言により、メンバー アクセスを制御できます。メンバーのアクセシビリティは、メンバーの宣言されたアクセシビリティ (§3.5.1) と、すぐに含まれる型のアクセシビリティ (存在する場合) を組み合わせることによって確立されます。
...
アクセスが行われるテキストの場所がメンバーのアクセシビリティ ドメイン (§3.5.2) に含まれている場合、メンバーへのアクセスが許可されます。
次に、セクション 3.5.2 (アクセシビリティ ドメイン) で:
プログラム P 内の型 T で宣言されたネストされたメンバー M のアクセシビリティ ドメインは、次のように定義されます (M 自体が型である可能性があることに注意してください)。
- M の宣言されたアクセシビリティがパブリックである場合、M のアクセシビリティ ドメインは T のアクセシビリティ ドメインです。
- ...
- M の宣言されたアクセシビリティが非公開の場合、M のアクセシビリティ ドメインは T のプログラム テキストです。
これはここに当てはまります。つまり、 のアクセシビリティ ドメインはDoSomething
最初PrivateInnerClass
の箇条書きの のアクセシビリティ ドメインです... しかし、最後の箇条書きPrivateInnerClass
のプログラム テキストはのアクセシビリティ ドメインです。OuterClassBase
したがって、 内の呼び出しOuterClassDerived
はのアクセシビリティ ドメインにないDoSomething
ため、呼び出すことができません。
そもそもProtectedInnerClass
派生できることに本当に驚いています...PrivateInnerClass
編集:そして、できないことが判明しました...OuterClassDerived
クラスを完全に削除しても、次のエラーが発生します:
Test.cs(10,21): error CS0060: Inconsistent accessibility: base class
'OuterClassBase.PrivateInnerClass' is less accessible than class
'OuterClassBase.ProtectedInnerClass'
これは、仕様のセクション 10.1.4.1 に違反しています。
クラス型の直接の基本クラスは、少なくともクラス型自体と同じくらいアクセス可能でなければなりません (§3.5.2)。たとえば、パブリック クラスがプライベート クラスまたは内部クラスから派生すると、コンパイル時エラーになります。
ここでは、プライベート クラスから保護されたクラスを派生させようとしています。保護されたクラスはプライベート クラスよりもアクセスしやすいため、エラーが発生します。