5
protected internal class foo
{
    //this compiles without any errors
}

また

internal class bar
{
    public int quix;
    protected internal int zyx;
    //this compiles without any errors
}

これらのコンパイラのバグまたは私の標準の誤解ですか?

説明:

  1. クラスは、保護された内部アクセス修飾子を持つことはできません。MSDNによるとパブリックまたは内部のみです(名前空間内で直接宣言されている(つまり、他のクラスまたは構造内にネストされていない)クラスおよび構造体は、パブリックまたは内部のいずれかになります。アクセス修飾子が指定されていない場合、内部がデフォルトです)。
  2. すべてのアクセス修飾子をすべてのコンテキストのすべてのタイプまたはメンバーで使用できるわけではありません。場合によっては、タイプメンバーのアクセシビリティは、その包含タイプ(MSDN)のアクセシビリティによって制約されます。公衆は失敗するはずです。保護された内部は私にはあいまいです-内部修飾子は必要ありません。

編集:私がMonoを使用しているという事実は不要です。なぜなら、質問は、MONOが何をするか、何をしないかではなく、標準が何を言うかについてでした。多分私は自分のコンパイラをコーディングしています。そのため、MSDNを引用して、許可されているものと許可されていないものを正確に示しました。

4

5 に答える 5

22

上記の私のコメントで述べたように、or NOT and をprotected internal意味します。ここにバグはありません:)protected internal protected internal

詳細情報/説明はハッキングされています

ご質問への回答:

  1. 名前空間内の (別のクラス内ではなく) クラスは、 orとしてのみ宣言publicinternalできます。ただし、別のクラス内のクラスは、、などとして宣言できます。protected internalprivate

  2. はい、protected internalアクセス修飾子がメンバーよりも厳密なクラス内で使用できます。以下の完全に有効な使用例を参照してください (クラスはクラス内にあることに注意してくださいProgram)。

    public class Program
    {
        static void Main(string[] args)
        {
        }
    
        private class Foo
        {
            private int priv { get; set; }
            protected internal int protint { get; set; }
            public int pub { get; set; }
        }
    }
    
于 2013-01-23T09:30:21.967 に答える
2

からAccess Modifiers (C# Programming Guide)

protected internal

型またはメンバーには、それが宣言されているアセンブリ内の任意のコードから、または別のアセンブリ内の派生クラス内からアクセスできます。

于 2013-01-23T09:33:40.090 に答える
2

これに関するMSDNエントリを引用するには:

保護された内部

型またはメンバーには、それが宣言されているアセンブリ内の任意のコードから、または別のアセンブリ内の派生クラス内からアクセスできます。別のアセンブリからのアクセスは、保護された内部要素が宣言されているクラスから派生したクラス宣言内で行う必要があり、派生クラス型のインスタンスを介して行う必要があります。

したがって、宣言は完全に理にかなっています。クラスの外で使用すると、期待どおりに動作するだけです。

于 2013-01-23T09:33:48.297 に答える
2

さらに、クラスが何らかの名前空間のメンバーとして宣言されている場合、 「保護された内部クラス」がコンパイルされるとは思えません。

C# コンパイラは次のように述べています。

名前空間で定義された要素は、private、protected、または protected internal として明示的に宣言することはできません

保護されたクラスは常にネストされたクラスになります!

アップデート

あなたはMonoコンパイラのいくつかのバージョンであなたのコードサンプルを試していて、質問のサンプルコードで言ったので//this compiles without any errors、Monoの質問にタグを付けなかった理由を理解できませんでした.

標準は、Microsoft C# コンパイラの動作です。「なぜ何かがコンパイルされるのか」について質問し、公式のものを使用していないことに言及しない場合、コンパイラはコードをコンパイルすると仮定しているだけです。

どれが標準か知りたいですか?繰り返しになりますが、保護されたクラスは常にネストされたクラスになります。

于 2013-01-23T09:34:52.287 に答える
0

キーワードprotectedは継承にinternal属し、キーワードはスコープに属します。

于 2013-01-23T09:34:59.783 に答える