8

私は、ジョセフ・アルババリとベン・アルババリによる本「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()
        {
        }
    }
}
4

2 に答える 2

12

ネストされたクラスを別のクラスinternalに配置しています。

たとえば、次のようになります。

class Program
{
    static void Main(string[] args)
    {
    }

    internal class A { }
    public class B : A { }
}

ラッピング クラスの修飾子がクラスの修飾子を意味のないものにするため、コンパイルさます。むしろ、 typeのアクセシビリティは、ラップされたクラスによって制限されます。アクセシビリティ ドメインも同様です。internalpublicBBPrograminternal

次のように更新した場合:

class Program
{
    static void Main(string[] args)
    {
    }
}

internal class A { }
public class B : A { }

一貫性のない可視性コンパイラ エラーがスローされます。または、代わりに再定義Programすると、エラーもスローされます。この場合、のアクセシビリティ ドメインは現在、のアクセシビリティ ドメインによって制限されていません。publicinternalBpublicPrograminternal


C# 仕様3.5.2 Accessibility Domainsから:

プログラム P 内の型 T で宣言されたネストされたメンバー M のアクセシビリティ ドメインは、次のように定義されます (M 自体が型である可能性があることに注意してください)。

M の宣言されたアクセシビリティがパブリックである場合、M のアクセシビリティ ドメインは T のアクセシビリティ ドメインです。

MSDN のアクセシビリティドメインの説明:

メンバーが別の型内に入れ子になっている場合、そのアクセシビリティ ドメインは、メンバーのアクセシビリティ レベルと、すぐに含まれている型のアクセシビリティ ドメインの両方によって決定されます。

ラッピング タイプPrograminternalである場合、ネストされたタイプBビーイングpublicは と一致するアクセシビリティを持つためProgram、 として扱われinternal、コンパイラ エラーはスローされません。

于 2013-05-20T12:58:14.053 に答える