Roslyn GitHubのドキュメントの一部として、C#およびVB向けに計画された言語機能を備えた Language feature implementation status というページがあります。
頭を包むことができなかった機能の1つは、private protected
アクセス修飾子でした。
private protected string GetId() { … }
C#Language Design Notes のページもあり、多くの新機能について説明していますが、この機能については説明していません。
Eric Lippertは comment で言った:
あなたのエラーは、修飾子を制限の増加と考えることです。実際、修飾子は常に制限を緩和します。物事はデフォルトで「プライベート」であることに注意してください。修飾子を追加することによってのみ、制限が緩和されます。
private protected
の意味は何ですか?いつ使用しますか?
De Bill EvjenとJay Glynnによる「 Professional C#2008 」、1699ページによると:
private protected-「現在のアセンブリ内の派生型のみ」
C++/CLIにも同様の機能があります- クラスと構造体の定義と消費(C++/CLI)>メンバーの可視性 :
private protected
-または-protected private
-メンバーはアセンブリ内で保護されていますが、アセンブリ外ではプライベートです。
以下は、より制限的なものからより無差別なものまで、ベン図のすべてのアクセス修飾子です。
private
:
private protected
:- C#7.2で追加
internal
:
protected
:
protected internal
:
public
:
これは、さまざまなアクセシビリティレベルのグラフ( http://ashitani.jp/gv/ で作成)を提供するためのものです(画像はコメントに収まりません)。
各矢印は「より制限的」を意味します。
CLR名はPrivate
、FamilyANDAssembly
、Assembly
、Family
、FamilyORAssembly
、Public
です。
かなり後の編集:このニースの新しいアクセスレベル(名前が非常に悪い)は、最終的にC#6.0に含まれていたnotでした。 C#7.2からのみサポートされます(質問「タグ」を更新しました)。
これは単なる推測ですが、名前からは、protected
のより制限されたバージョン(または、必要に応じてprivate
のより緩和されたバージョン)であると推測できます。そして、合理的な唯一のバリアントは、protected
の動作をアセンブリに制限することです。
考えられる使用法:protected
を内部実装に使用したいが、外部使用には使用したくない(そしてクラスを封印したくない)。
追伸 CLRではなく、C#ではない に常に存在していました。 protected
andinternal
の組み合わせです、引用:
CLRは、「家族とアセンブリ」アクセスタイプもサポートしています。これは、同じアセンブリで宣言されている場合にのみ、宣言型、ネスト型および派生型内からメソッドにアクセスできることを意味します。明らかに、C#チームはこれを非常に便利な機能とは考えていなかったため、この言語ではサポートされていません。
「可能」は、同じアセンブリにあるサブクラスにのみ表示されます。これにより、protected
よりも少し制限されます。
「プライベート保護」機能については、 spec をご覧ください。
Private protectedの直観的な意味は、「このアセンブリ内で、包含クラスから派生した型によってアクセス可能」です。