it-swarm.it

Errore "Gli elementi definiti in un namespace non possono essere dichiarati esplicitamente come interni privati, protetti o protetti"

Ho provato a rendere una classe privata e ho ottenuto questo errore "Gli elementi definiti in un namespace non possono essere dichiarati esplicitamente come interni privati, protetti o protetti"

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

54
user576510

Perché privato significa 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 intendesse per privato in una classe di alto livello?

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

72
DeCaf

Puoi usare solo public o internal nel livello Namespace

12
John

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

3
Kostassoid

Come ha detto Abatonime , puoi usare solo public o internal nel livello Namespace.
private, protected o protected internal possono essere utilizzati solo a livello di classe.

Questo funziona

namespace X
{
    class A
    {
        // class code here

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

Questo non lo farà

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

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

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

2
pil0t

Ho avuto lo stesso problema perché stavo creando una custom DLL e volevo solo che alcune classi fossero visibili a un'applicazione che utilizzava 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 codice di esempio sopra, la classe "SmartCardIdentity" è disponibile per un'altra classe all'interno dello stesso spazio dei nomi, ma non è disponibile per chiamare l'applicazione quando questa classe viene inserita in una DLL. Non l'ho testato in alcun modo (cioè visibilità da una classe in un namespace diverso all'interno della DLL.).

1
dars67

Nel mondo reale ci concentriamo sull'oggetto visibile. Una volta che l'oggetto è visibile, allora parliamo dello scope dell'oggetto

esempio nel mondo reale

Se cammini per strada, vedi case in una colonia di colonia che ha case. Se la colonia è protetta, nessuno può vedere le case. Non si considera che nessuna colonia sia presente

In programmazione

Se rendiamo la classe privata/protetta al massimo livello nessuno lo sa

è presente in Assemblea?

per favore correggimi, se sono fuori portata

0
Sameer Bahad

L'accessibilità predefinita dei tipi di livello superiore è internal.

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

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

Quindi una classe è di default private, e se vuoi accedervi, devi prima inserire public.

0
Hemant

Solo Public e Internal sono applicabili quando si definisce la classe. Se nessun modificatore di accesso è definito prima che l'impostazione predefinita della classe sia internal.

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

0
Neeraj Kumar