Clase pública es inaccesible debido a su nivel de protección

Tengo las siguientes clases:

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

Ahora trato de hacer lo siguiente:

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

Que devuelve el siguiente error: ClassB es inaccesible debido a su nivel de protección.

Pero todos ellos son de público.

  • por favor, agregar el espacio de nombres y el resto del código
  • este código se compila
  • Trate de no usar pseudocódigo y posteriores a la cosa real ya que no hay nada de eso, de que debe causar el problema.
  • Actualizado con el código real. Y es C#.
InformationsquelleAutor jao | 2013-08-23

3 Kommentare

  1. 87

    Este error es consecuencia del nivel de protección de ClassB‘s constructor, no ClassB sí mismo. Puesto que el nombre del constructor es el mismo que el nombre de la clase* , el error puede ser interpretado de forma incorrecta. Dado que no se especifica el nivel de protección de su constructor, se supone que es internal por defecto. Declarar el constructor public va a solucionar este problema:

    public ClassB() { } 

    * también se podría decir que los constructores no tienen nombre, sólo un tipo; esto no cambia la esencia del problema.

    • Estoy de acuerdo, aunque el cto r de ClassA puede ser protegido
    • Hay un facepalm momento. Gracias
    • Gracias por su respuesta. Modificar el constructor público solucionado el problema.
  2. 3

    También si quieres hacer algo como ClassB.Run("thing");, asegúrese de que el Método Run(); es static o se le puede llamar así: thing.Run("thing");.

  3. 0

    Usted podría ir en el diseñador del formulario web y cambiar la «web» para ser «público» en lugar de «protegido», pero no estoy seguro de lo seguro que es. Yo prefiero que oculta las entradas y tener algo de jQuery establecer los valores en los que están ocultos a los insumos, a continuación, crear propiedades públicas en la web de clase del formulario (el código), y tener acceso a los valores de esa manera.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea