web-dev-qa-db-ja.com

名前空間で定義された要素を明示的に宣言できないのはなぜですか?

次のC#コードがあります。

namespace ISeeOptic.BL
{

  public abstract class Process
  {        
     ...      

     protected static void DeleteImages(List<ImagesPath> list)
      {
          some logic
      } 

      ...
   }


    protected class GetDataBL: Process
    {
      ...

     public static void DeleteImages(List<ImagesPath> list)
     {
         DeleteImages(list); 
     } 
     ...
 }
} 

コンパイル時に次のエラーが発生します。

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

私はC#の初心者なので、この質問は素朴に思えるかもしれませんが、このエラーの原因は何ですか?

よろしくお願いします。

35
Michael

名前空間で定義された要素は、パブリックまたは内部で明示的に宣言できます。

これらの修飾子はクラスのメンバーに対してのみ意味があるため、明示的にプライベートまたは保護(または保護内部)として宣言することはできません。

たとえば、「保護されている」とは「含まれているクラスから継承するクラスにアクセスできる」という意味なので、protected class GetDataBLは意味がありませんが、GetDataBLには含まれているクラスがありません。

36
phoog

privateprotectedは、このクラスまたは派生クラスにアクセスできることを意味します。
名前空間レベルでは、派生するクラスがないため、役に立たない。

publicレベルではinternalまたはNamespaceのみを使用できます

MSDNドキュメント

(実際にコンパイル時にエラーが発生すると思います。実行時にseeingのみの場合、実行時にコードがコンパイルされている可能性があります。たとえば、 Webアプリ。論理的には、例外ではなくコンパイル時のエラーです。)

protectedアクセス修飾子は(緩やかに)メンバーを派生包含型にアクセス可能にします。ただし、ネームスペースメンバーの場合、isを含む型はありません。

同様に、プライベートメンバーのアクセシビリティドメインは、包含タイプのプログラムテキストです。繰り返しになりますが、is包含タイプはありません。

GetDataBLを保護して実際に何をしようとしているのですかachieve

8
Jon Skeet

エラーとC#仕様(ECMAセクション10.5.1)で説明されているように、エラーの原因となっている要素のスコープです。

  • コンパイル単位または名前空間で宣言された型は、publicまたはinternalで宣言されたアクセシビリティを持つことができ、デフォルトでinternalで宣言されたアクセシビリティになります。
  • クラスメンバーは5種類の宣言されたアクセシビリティのいずれかを持つことができ、デフォルトでprivate宣言されたアクセシビリティになります。
  • 構造体は暗黙的にシールされているため、構造体のメンバーはpublicinternal、またはprivateで宣言されたアクセシビリティを持ち、デフォルトでprivateで宣言されたアクセシビリティを持つことができます。
3
Grant Thomas

クラスPrivateでは、ProtectedおよびProtected Internalアクセス指定子は名前空間レベルでは許可されません。

許可されている指定子のみがパブリックで、クラスの内部にあります。

子クラスにのみ、プライベート、保護、または保護された内部アクセス指定子が許可されます。

サンプルコード

internal class ParentClass
{
    public string test()
    {
        return "This is the parent class function";
    }
    private class BaseChildClass
    {
        protected string childtest()
        {
            return "This is the parent class function";
        }
    }

    private class DerivedChildClass : BaseChildClass
    {
        private void test1()
        {
            string test = base.childtest();

        }
    }
}
1
Afazal