c# - una - puede que esté inaccesible debido a su nivel de protección
La clase pública es inaccesible debido a su nivel de protección (3)
Este error es el resultado del nivel de protección del ClassB
de ClassB
, no de ClassB
. Como el nombre del constructor es el mismo que el nombre de la clase * , el error puede interpretarse incorrectamente. Como no especificó el nivel de protección de su constructor, se supone que es internal
por defecto. Declarar el constructor public
solucionará este problema:
public ClassB() { }
* También se podría decir que los constructores no tienen nombre, solo un tipo; esto no cambia la esencia del problema.
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");
}
}
Lo cual devuelve el siguiente error: ClassB es inaccesible debido a su nivel de protección.
Pero todos son públicos.
Puede entrar en el diseñador del formulario web y cambiar los "controles web" para que sean "públicos" en lugar de "protegidos", pero no estoy seguro de cuán seguro es. Prefiero hacer entradas ocultas y tener jQuery establecer los valores en esas entradas ocultas, luego crear propiedades públicas en la clase del formulario web (código detrás) y acceder a los valores de esa manera.
También si quieres hacer algo como ClassB.Run("thing");
, asegúrese de que el Método Run();
es static
o podrías llamarlo así: thing.Run("thing");
.