web-dev-qa-db-fra.com

Pourquoi les éléments définis dans un espace de noms ne peuvent pas être explicitement déclarés?

J'ai le code C # suivant: 

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); 
     } 
     ...
 }
} 

Au moment de la compilation, j'obtiens l'erreur suivante:

Les éléments définis dans un espace de noms ne peuvent pas être explicitement déclarés comme privés, protégés ou internes protégés

Je suis débutant en C # alors peut-être que cette question peut sembler naïve, Aucune idée de la cause de cette erreur?

Merci d'avance.

31
Michael

Les éléments définis dans un espace de noms peuvent être explicitement déclarés publics ou internes.

Ils ne peuvent pas être explicitement déclarés privés ou protégés (ou protégés internes) car ces modificateurs n'ont de sens que pour les membres d'une classe.

Votre protected class GetDataBL, par exemple, n'a aucun sens, car "protected" signifie "accessible aux classes qui héritent de la classe contenant" - mais il n'y a pas de classe contenant pour GetDataBL.

30
phoog

privateprotected signifie qu'ils seront accessibles à cette classe ou aux classes dérivées.
Au niveau de l'espace de noms, il n'y a pas de classe dérivée, donc inutile.

Vous ne pouvez utiliser que public ou internal au niveau Namespace

Documents MSDN

12
gdoron

(Je pense que vous obtiendrez en fait une erreur lors de la compilation; si vous êtes seulement voyez au moment de l'exécution, il est probable que votre code soit également compilé au moment de l'exécution, par exemple dans le cadre d'un site Web. logiquement, c’est une erreur de compilation, pas une exception.)

Le modificateur d'accès protected (de manière lâche) rend un membre accessible à un type contenant dérivé; mais dans le cas d'un membre d'espace de nom, il y a est pas de type contenant.

De même, le domaine d'accessibilité d'un membre privé est le texte du programme contenant le type - et encore une fois, il y a est pas de type contenant.

Que tentez-vous réellement de réaliser {réaliser} _ en protégeant GetDataBL?

8
Jon Skeet

C'est la portée des éléments qui cause l'erreur, comme l'explique l'erreur - et la spécification C # (section 10.5.1 de l'ECMA):

  • Les types déclarés dans des unités de compilation ou des espaces de noms peuvent avoir public ou internal déclarés accessibilité et par défaut à internal déclarés accessibilité.
  • Les membres du groupe peuvent avoir l’un des cinq types d’accessibilité déclarée et la valeur par défaut private déclarée.
  • Les membres de la structure peuvent avoir public, internal ou private déclarés accessibilité et par défaut à private accessibilité déclarée car les structures sont implicitement scellées.
3
Grant Thomas

Dans la classe Privé, Protégé et Protégé, accès interne Les spécificateurs ne sont pas autorisés au niveau de l'espace de noms.

Seuls les spécificateurs autorisés sont publics et internes à la classe.

Uniquement pour les classes enfants accès interne privé, protégé ou protégé Les spécificateurs sont autorisés.

Exemple de code

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