web-dev-qa-db-fra.com

Erreur "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"

J'ai essayé de rendre une classe privée et j'ai cette erreur "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"

J'ai compris son sens mais je veux demander pourquoi cela n'est pas autorisé? Tous les modifires d'accès ne sont-ils pas applicables en classe? Pourquoi je ne peux pas rendre une classe privée, protégée ou protégée en interne?

54
user576510

Parce que privé signifie que le membre n'est visible que dans la classe contenue. Puisqu'une classe de niveau supérieur ne contient pas de classe, elle ne peut pas être privée (ou protégée). (Internes ou publics sont des modificateurs valides cependant).

Que voulez-vous que privé signifie dans une classe de haut niveau?

Bien sûr, tous les modificateurs s’appliquent aux classes imbriquées, c’est-à-dire à une classe définie dans une autre classe.

72
DeCaf

Vous pouvez utiliser uniquement public ou internal au niveau de l'espace de noms.

12
John

Parce que ça n'a pas de sens. Vous ne pouvez pas accéder aux classes protégées ou privées définies au niveau de l'espace de noms, uniquement en tant que classes imbriquées.

3
Kostassoid

Comme le dit Abatonime , vous ne pouvez utiliser que public ou internal au niveau de l'espace de noms.
private, protected ou protected internal ne peut être utilisé qu'au niveau classe.

Cela marche

namespace X
{
    class A
    {
        // class code here

        private class B
        {
            // class code here
        }
    }
}

Ce ne sera pas

namespace X
{
    class A
    {
        // class code here
    }

    private class B
    {
        // class code here
    }
}
2
SNag

Seules les classes imbriquées peuvent être déclarées comme privées . Les classes non imbriquées ne peuvent être que publiques ou internes (implicites sans modificateurs).

2
pil0t

J'ai eu le même problème parce que je créais une coutume DLL et que je voulais seulement que certaines classes soient visibles pour une application utilisant la DLL. Je supprime donc complètement le modificateur pour les classes que je voulais être privées (dans des espaces de noms spécifiques). Les classes sont restées accessibles aux autres classes du même espace-noms dans DLL - mais ne se sont pas affichées dans Intellisense dans l'application appelante. Pas besoin de classes imbriquées. La seule explication à laquelle je puisse penser est que le message d'erreur indique que vous ne pouvez pas déclarer "explicitement" privé ... il ne dit rien implicitement. 

namespace SmartCardAuthentication
{
  class SmartCardIdentity : IIdentity
  {
    private string _firstName;
    private string _lastName;
    private string _middleInitial;

        ....
   }
}

Dans l'exemple de code ci-dessus, la classe "SmartCardIdentity" est disponible pour les autres classes du même espace de nom, mais pas pour l'application appelante lorsque cette classe est intégrée dans une DLL. Je ne l'ai pas testé d'une autre manière (c'est-à-dire la visibilité d'une classe dans un espace de noms différent dans la DLL.).

1
dars67

Dans le monde réel, nous nous concentrons sur l'objet visible Une fois que l'objet est visible, nous parlons de la portée de l'objet.

exemple dans le monde réel

Si vous marchez dans la rue, vous voyez des maisons dans une colonie. Si la colonie est protégée, personne ne peut voir les maisons Il est considéré qu'aucune colonie aucune maison n'est présente

En programmation

Si nous rendons la classe privée/protégée au plus haut niveau, personne ne le sait

est-il présent à l'Assemblée?

corrigez-moi s'il vous plaît, si je suis hors de portée

0
Sameer Bahad

L'accessibilité par défaut des types de niveau supérieur est internal.

L'accessibilité par défaut des membres de classe et de structure est private.

La seule accessibilité possible des membres d'interface et d'énum est public.

Donc, une classe est par défaut private, et si vous voulez y accéder, vous devez mettre public avant cela.

0
Hemant

Seuls Public et Internal sont applicables lors de la définition de la classe. Si aucun modificateur d'accès n'est défini avant la classe, la valeur par défaut est internal.

consultez MSDN - [ https://msdn.Microsoft.com/en-us/library/8fd16xs0(v=vs.90).aspx]

0
Neeraj Kumar