private protected (C# リファレンス)

キーワード組み合わせ private protected はメンバー アクセス修飾子です。 private protected メンバーには、包含クラスから派生した型からアクセスできますが、その包含アセンブリ内に限られます。 private protected と他のアクセス修飾子の比較については、「アクセシビリティ レベル」を参照してください。

注意

private protected アクセス修飾子は、C# バージョン 7.2 以降で有効です。

基底クラスの private protected メンバーには、変数の静的な型が派生クラス型の場合にのみ、その包含アセンブリで派生型からアクセスできます。 たとえば、次のコード セグメントを考えてみます。

public class BaseClass
{
    private protected int myValue = 0;
}

public class DerivedClass1 : BaseClass
{
    void Access()
    {
        var baseObject = new BaseClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 5;

        // OK, accessed through the current derived class instance
        myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass2 : BaseClass
{
    void Access()
    {
        // Error CS0122, because myValue can only be
        // accessed by types in Assembly1
        // myValue = 10;
    }
}

この例には、2 つのファイル (Assembly1.csAssembly2.cs) が含まれています。 最初のファイルには public 基底クラスである BaseClass とそれから派生した型である DerivedClass1 が含まれています。 BaseClass は private protected メンバー myValue を持っています。DerivedClass1 はこれに 2 通りのアクセスを試行します。 最初に BaseClass のインスタンス経由で myValue にアクセスしようとするとエラーが出ます。 ただし、DerivedClass1 で継承されたメンバーとして使用してみると成功します。

2 番目のファイルでは、DerivedClass2 の継承されたメンバーとして myValue にアクセスしようとしてエラーを出します。これには Assembly1 の派生型のみがアクセスできるためです。

Assembly1.csAssembly2 という名前の InternalsVisibleToAttribute が含まれている場合、派生クラス DerivedClass2 は、BaseClass で宣言された private protected メンバーにアクセスできます。 InternalsVisibleTo を使用すると、private protected メンバーを他のアセンブリの派生クラスから参照できるようになります。

構造体は継承できないため、構造体メンバーは private protected になりません。

C# 言語仕様

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目