私は、ジョセフ・アルババリとベン・アルババリによる本「C# 4.0 の要約」を読んでいます。そこから、アクセス修飾子に関するトピックの制限を見つけます。ページ 91、トピック「アクセス修飾子の制限」。
本より引用。
コンパイラは、アクセス修飾子の一貫性のない使用を防ぎます。たとえば、サブクラス自体は基本クラスよりアクセスしにくい場合がありますが、基本クラスよりアクセスしにくい場合があります。
したがって、これは、基本クラスがサブクラスと同等以上にアクセス可能であるべきであることを示しています。したがって、基本クラスが internal の場合、サブクラスは private または internal のいずれかにする必要があります。基本クラスがプライベートで、サブクラスがパブリックの場合、コンパイル時エラーが生成されます。Visual Studio でこれを試しているときに、奇妙な動作が見つかりました。
試行 1: ベースがプライベートで、サブクラスがプライベート (動作、正しい動作) これは、両方が内部、パブリックの場合にも機能します。
private class A { }
private class B : A { } // Works
試行 2: ベースがプライベートで、サブクラスがパブリックまたは内部 (これは失敗、正しい動作)
private class A { }
public class B : A { } // Error
試行 3 : Base は internal で、sub は public (これは機能しますが、失敗するはずです。Base はサブクラスよりもアクセスしにくいため)
internal class A { }
public class B : A { } // Works, but why
私の質問は、Try 3 が失敗しなかった理由です。サブクラスは公開されており、内部の基本クラスよりもアクセスしやすくなっています。本でさえ、これは失敗するはずだと言っています。しかし、Visual Studio はこれを正常にコンパイルしました。これはうまくいくはずですか?
編集:
VS で新しいコンソール プロジェクトを作成しました。Program.cs にコードを追加しました。Program.cs ファイルの完全なコードを次に示します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication
{
class Program
{
internal class A { }
public class B : A { } // Error
static void Main()
{
}
}
}