33

内部自動プロパティを作成したい:

internal bool IP { get; protected internal set; }

protectedセッターまたは-を作成することは可能だと思いましたがprotected internal、エラーアクセシビリティ修飾子はプロパティよりも制限的である必要があります。そうではないですか?Privateここでは、私を助けません。

編集:
質問は:内部ゲッターと保護されたセッターを使用して自動プロパティを実装するにはどうすればよいですか?

4

8 に答える 8

51

それは効果的にprotectedまたはinternal、ではなくです。同じアセンブリ内の派生クラスとタイプの両方からアクセスできます。protected internal同じアセンブリ内の派生クラスにのみアクセスできるという意味を考えるのはよくある誤解です。

于 2009-06-30T14:10:34.963 に答える
30

.NETレベルには、類似しているが異なる2つのアクセスレベルがあります。

  • FamilyAndAssembly:保護または内部よりも制限が厳しい
  • FamilyOrAssembly:保護または内部よりも制限が少ない

C#の「保護された内部」はFamilyOrAssemblyを意味します。FamilyAndAssemblyの修飾子はありません。

したがって、セッターはプロパティ全体protected internalよりも制限が少なくなります。internalあなたにできることは:

protected internal bool IP { internal get; set; }

しかし、セッターはゲッターよりも制限が少なく、奇妙です...

別の(やや同等の)代替手段は次のとおりです。

internal bool IP { get; set; }

protected void SetIP(bool ip)
{
    this.IP = ip;
}
于 2009-06-30T14:13:51.633 に答える
5

Eric LippertはSO自身にいるので、私はこの不正行為を検討しますが、彼はこの問題を考慮した優れたブログ投稿を書きました。

派生クラスから保護されたメンバーにアクセスできない理由、パート3

最終的に、彼の答えはここのポスターによって与えられたものとほぼ同じですが、彼は言語の設計とこれらの機能の実装の背後にあるいくつかの興味深い理由を宣伝しています。

于 2009-06-30T14:20:49.373 に答える
5

Jon Skeetが述べたこと(およびuser59808のコメント)を考慮すると、これは望ましい結果を達成しませんか?

protected internal bool IP { get; protected set; }

于 2010-12-08T15:36:55.840 に答える
2

protected internalどちらよりも制限が少ないかprotectedinternalサブクラス(protected)と同じアセンブリ内のすべてのもの()の両方がinternal何かにアクセスできるためです。

于 2009-06-30T14:11:41.620 に答える
1

保護された内部とは、同じアセンブリ内のクラス、または含まれているクラスから派生したクラスに表示されることを意味します。つまり、ANDではなく、内部要件または保護された要件を満たすクラスに表示されます。このように保護され、内部にあることを意味するアクセス修飾子はありません。

于 2009-06-30T14:11:49.123 に答える
1

保護された内部とは、保護された、または内部であり、保護されていない、内部を意味します。したがって、スコープは同じアセンブリまたは派生クラスに制限され、必ずしも両方に制限されるわけではありません。

于 2009-06-30T14:12:38.967 に答える
0

アクセシビリティ修飾子は、プロパティよりも制限的である必要があります

内部は保護されているよりも制限があります。保護されているものはアセンブリの外部で(サブクラスによって)表示される可能性があるためです。

コンパイラは、プロパティset全体が内部にある(つまり、アセンブリの外部に表示されない)場合、それが保護されている(つまり、アセンブリの外部のサブクラスに表示される)と言っても意味がないと言っています。IP

于 2009-06-30T14:16:47.757 に答える