次の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#の初心者なので、この質問は素朴に思えるかもしれませんが、このエラーの原因は何ですか?
よろしくお願いします。
名前空間で定義された要素は、パブリックまたは内部で明示的に宣言できます。
これらの修飾子はクラスのメンバーに対してのみ意味があるため、明示的にプライベートまたは保護(または保護内部)として宣言することはできません。
たとえば、「保護されている」とは「含まれているクラスから継承するクラスにアクセスできる」という意味なので、protected class GetDataBL
は意味がありませんが、GetDataBLには含まれているクラスがありません。
private
protected
は、このクラスまたは派生クラスにアクセスできることを意味します。
名前空間レベルでは、派生するクラスがないため、役に立たない。
public
レベルではinternal
またはNamespace
のみを使用できます
(実際にコンパイル時にエラーが発生すると思います。実行時にseeingのみの場合、実行時にコードがコンパイルされている可能性があります。たとえば、 Webアプリ。論理的には、例外ではなくコンパイル時のエラーです。)
protected
アクセス修飾子は(緩やかに)メンバーを派生包含型にアクセス可能にします。ただし、ネームスペースメンバーの場合、isを含む型はありません。
同様に、プライベートメンバーのアクセシビリティドメインは、包含タイプのプログラムテキストです。繰り返しになりますが、is包含タイプはありません。
GetDataBL
を保護して実際に何をしようとしているのですかachieve?
エラーとC#仕様(ECMAセクション10.5.1)で説明されているように、エラーの原因となっている要素のスコープです。
- コンパイル単位または名前空間で宣言された型は、
public
またはinternal
で宣言されたアクセシビリティを持つことができ、デフォルトでinternal
で宣言されたアクセシビリティになります。- クラスメンバーは5種類の宣言されたアクセシビリティのいずれかを持つことができ、デフォルトで
private
宣言されたアクセシビリティになります。- 構造体は暗黙的にシールされているため、構造体のメンバーは
public
、internal
、またはprivate
で宣言されたアクセシビリティを持ち、デフォルトでprivate
で宣言されたアクセシビリティを持つことができます。
クラス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();
}
}
}