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

キーワード組み合わせ private protected はメンバー アクセス修飾子です。The private protected keyword combination is a member access modifier. private protected メンバーには、包含クラスから派生した型からアクセスできますが、その包含アセンブリ内に限られます。A private protected member is accessible by types derived from the containing class, but only within its containing assembly. private protected と他のアクセス修飾子の比較については、「アクセシビリティ レベル」を参照してください。For a comparison of private protected with the other access modifiers, see Accessibility Levels.


private protected アクセス修飾子は、C# バージョン 7.2 以降で有効です。The private protected access modifier is valid in C# version 7.2 and later.


基底クラスの private protected メンバーには、変数の静的な型が派生クラス型の場合にのみ、その包含アセンブリで派生型からアクセスできます。A private protected member of a base class is accessible from derived types in its containing assembly only if the static type of the variable is the derived class type. たとえば、次のコード セグメントを考えてみます。For example, consider the following code segment:

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) が含まれています。This example contains two files, Assembly1.cs and Assembly2.cs. 最初のファイルには public 基底クラスである BaseClass とそれから派生した型である DerivedClass1 が含まれています。The first file contains a public base class, BaseClass, and a type derived from it, DerivedClass1. BaseClass は private protected メンバー myValue を持っています。DerivedClass1 はこれに 2 通りのアクセスを試行します。BaseClass owns a private protected member, myValue, which DerivedClass1 tries to access in two ways. 最初に BaseClass のインスタンス経由で myValue にアクセスしようとするとエラーが出ます。The first attempt to access myValue through an instance of BaseClass will produce an error. ただし、DerivedClass1 で継承されたメンバーとして使用してみると成功します。However, the attempt to use it as an inherited member in DerivedClass1 will succeed.

2 番目のファイルでは、DerivedClass2 の継承されたメンバーとして myValue にアクセスしようとしてエラーを出します。これには Assembly1 の派生型のみがアクセスできるためです。In the second file, an attempt to access myValue as an inherited member of DerivedClass2 will produce an error, as it is only accessible by derived types in Assembly1.

Assembly1.csAssembly2 という名前の InternalsVisibleToAttribute が含まれている場合、派生クラス DerivedClass1 は、BaseClass で宣言された private protected メンバーにアクセスできます。If Assembly1.cs contains an InternalsVisibleToAttribute that names Assembly2, the derived class DerivedClass1 will have access to private protected members declared in BaseClass. InternalsVisibleTo を使用すると、private protected メンバーを他のアセンブリの派生クラスから参照できるようになります。InternalsVisibleTo makes private protected members visible to derived classes in other assemblies.

構造体は継承できないため、構造体メンバーは private protected になりません。Struct members cannot be private protected because the struct cannot be inherited.

C# 言語仕様C# language specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also