2013-08-23 16 views
31

Ho le seguenti classi:Classe pubblica è inaccessibile a causa del livello di protezione

namespace Bla.Bla 
{ 
    public abstract class ClassA 
    { 
     public virtual void Setup(string thing) 
     { 
     } 

     public abstract bool IsThingValid(); 

     public abstract void ReadThings(); 

     public virtual void MatchThings() { } 

     public virtual void SaveThings() { } 

     public void Run(string thing) 
     { 
      Setup(thing); 

      if (!IsThingValid()) 
      { 

      } 

      ReadThings(); 
      MatchThings(); 
      SaveThings(); 
     } 
    } 
} 

namespace Bla.Bla 
{ 
    public class ClassB : ClassA 
    { 
     ClassB() { } 

     public override void IsThingValid() 
     { 
      throw new NotImplementedException(); 
     } 

     public override void ReadThings() 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

Ora cerco di fare quanto segue:

public class ClassC 
{ 
    public void Main() 
    { 
     var thing = new ClassB(); 
     ClassB.Run("thing"); 
    } 
} 

che restituisce il seguente errore: ClassB è inaccessibile a causa al suo livello di protezione.

Ma sono tutti pubblici.

+1

è C#, @Hans –

+0

per favore, aggiungere spazio dei nomi, e altri codici –

+1

@HansPassant, questo codice compila – Habib

risposta

62

Questo errore è il risultato del livello di protezione dei ClassB s' costruttore, non ClassB sé. Poiché il nome del costruttore è lo stesso del nome della classe *, l'errore potrebbe essere interpretato in modo errato. Poiché non hai specificato il livello di protezione del tuo costruttore, si presume che sia internal per impostazione predefinita. Dichiarando il costruttore public risolverà questo problema:

public ClassB() { } 

* Si potrebbe anche dire che i costruttori non hanno nome, ma solo un tipo; questo non cambia l'essenza del problema.

+0

Sono d'accordo anche se il Ctor per ClassA può essere protetto –

+0

Grazie. Funziona – AhammadaliPK

+0

C'è un momento facepalm. Grazie – jleach

3

Inoltre, se si vuole fare qualcosa di simile ClassB.Run("thing");, assicurarsi che il metodo è Run();static o si potrebbe chiamare in questo modo: thing.Run("thing");.

0

Si potrebbe andare nel progettista del modulo Web e modificare i "webcontrols" in modo che siano "pubblici" anziché "protetti", ma non sono sicuro di quanto sia sicuro. Preferisco creare input nascosti e avere jQuery che imposti i valori in questi input nascosti, quindi creare proprietà pubbliche nella classe del modulo Web (codice retrostante) e accedere ai valori in questo modo.

Problemi correlati