2011-09-11 13 views
51

Ho provato a creare una classe come privata e ho ottenuto questo errore "Gli elementi definiti in uno spazio dei nomi non possono essere dichiarati esplicitamente come privati, protetti , o protetto interno "Errore "Gli elementi definiti in un namespace non possono essere dichiarati esplicitamente come interni privati, protetti o protetti"

Ho ottenuto il suo significato, ma voglio chiedere perché questo non è consentito? Tutti i modificatori di accesso non sono applicabili alla Classe? Perché non riesco a rendere una classe privata, protetta o protetta all'interno?

risposta

69

Perché privato indica che il membro è visibile solo nella classe contenente. Poiché una classe di livello superiore non ha una classe che la contiene, non può essere privata (o protetta). (Interno o pubblico sono comunque modificatori validi).

Cosa vorresti che il privato intendesse in una classe di alto livello?

Ovviamente tutti i modificatori si applicano alle classi nidificate, ad esempio una classe definita all'interno di un'altra classe.

+3

Cosa succede se voglio che una classe sia visibile solo per le classi in un determinato spazio dei nomi? come si fa, senza dover spostare la classe in un altro? – Ahmed

+2

Fondamentalmente non è possibile. Sarebbe una specie di strana caratteristica avere se mi chiedi, poiché lo stesso spazio dei nomi può esistere in più assiemi, per esempio. – DeCaf

+0

Grazie, immagino che java abbia qualcosa come l'accesso a livello di pacchetto o simile, lo vedrò .. – Ahmed

2

Solo le classi annidate possono essere dichiarate come private. Le classi non nidificate possono essere solo pubbliche o interne (implicite senza modificatori)

3

Perché non ha senso. Non è possibile accedere a classi private o protette definite a livello di spazio dei nomi, solo come classi nidificate.

+1

Ora che hai detto che 'private' doesn ' Ha senso, cerca di giustificare il motivo per cui "pubblico" ha senso, senza contraddire te stesso. E dal momento che non possiamo scrivere 'private', che cos'è una classe senza qualificatore di accesso? Nessun gentiluomo, qui, sicuramente, è C# che non ha senso. 'private' significherebbe solo visibile in questo spazio dei nomi e' internal private 'significherebbe questo spazio dei nomi in questo assembly. Ha perfettamente senso al contrario. –

+0

@ v.oddou: non sono sicuro se è C# di limitazione CLR. comunque, anch'io preferirei più modificatori di accesso granulari (come forse in Scala). ma il design attuale è abbastanza solido per me e non mi infastidisce o limita, a differenza di molti altri difetti di C#. – Kostassoid

12

è possibile utilizzare solo public o internal del livello Namespace

0

L'accessibilità predefinito di tipi di livello superiore è internal.

L'accessibilità predefinita dei membri classe e struttura è private.

L'unica accessibilità possibile dei membri di interfaccia e enum è public.

Quindi una classe è per impostazione predefinita private e, se si desidera accedervi, è necessario inserire public prima.

+1

La domanda sta parlando degli specificatori di accesso su * classi * (in particolare, classi di primo livello), non * membri di classe *. Questa risposta non risponde alla domanda posta e "una classe è di default privata" è semplicemente errata. –

1

As Abatonime said, è possibile utilizzare solo public o internal nel livello Namespace.
private, protected o protected internal può essere utilizzato solo a livello di Classe.

Questo funziona

namespace X 
{ 
    class A 
    { 
     // class code here 

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

Questo non

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

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

Aggiunta questa risposta in quanto questo thread non ha un esempio di codice. – SNag

1

Ho avuto questo stesso problema, perché stavo creando una DLL personalizzato e solo voluto alcune classi per essere visibile ad un'applicazione che utilizza la DLL. Quindi rimuovo completamente il modificatore per le classi che volevo essere private (all'interno di spazi dei nomi specifici).Le classi sono rimaste accessibili ad altre classi all'interno dello stesso spazio dei nomi nella DLL ma non sono state visualizzate in Intellisense nell'applicazione chiamante. Non c'è bisogno di classi nidificate. L'unica spiegazione che riesco a pensare è che il messaggio di errore dice che non è possibile "esplicitamente" dichiarare privato ... non dice nulla implicitamente.

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

     .... 
    } 
} 

Nel esempio di codice di cui sopra, di classe "SmartCardIdentity" è a disposizione di altra classe all'interno dello stesso spazio dei nomi, ma non disponibile a chiamare applicazione quando questa classe è rotolato in una DLL. Non l'ho testato in alcun modo (cioè visibilità da una classe in un namespace diverso all'interno della DLL.).

Problemi correlati