Accesibilidad inconsistente: el tipo de parámetro es menos accesible que el método

227

Estoy tratando de pasar un objeto (una referencia al usuario actualmente conectado, básicamente) entre dos formularios. Por el momento, tengo algo en este sentido en el formulario de inicio de sesión:

private ACTInterface oActInterface;

public void button1_Click(object sender, EventArgs e)
    {
        oActInterface = new ACTInterface(@"\\actserver\Database\Premier.pad",this.textUser.Text,this.textPass.Text);

        if (oActInterface.checkLoggedIn())
        {
            //user has authed against ACT, so we can carry on
            clients oClientForm = new clients(oActInterface);
            this.Hide();
            oClientForm.Show();
        }
        else...

en el siguiente formulario (clientes), tengo:

public partial class clients : Form
{
    private ACTInterface oActInt {get; set;}

    public clients(ACTInterface _oActInt)

... lo que me lleva a obtener:

Error   1   Inconsistent accessibility: 
parameter type 'support.ACTInterface' is less accessible than method    
'support.clients.clients(support.ACTInterface)'  
c:\work\net\backup\support\support\clients.cs   20  16  support

Realmente no entiendo cuál es el problema: ambos campos son privados y se accede mediante el método público relevante desde el formulario. Buscar en Google realmente no ayuda, ya que solo apunta a que un elemento es público y el otro privado, que no es el caso aquí.

Alguien ayuda?

dodgrile
fuente

Respuestas:

353

El constructor de la publicclase clientses publicpero tiene un parámetro de tipo ACTInterfaceque es private(¿está anidado en una clase?). No puedes hacer eso. Debe hacer ACTInterfaceal menos tan accesible como clients.

jason
fuente
2
Para obtener más información, consulte el artículo de MSDN sobre el error CS0051
Alexei Levenkov
55
Esto me ayudo. Estaba tratando de hacer lo siguiente: JsonConvert.DeserializeObject <List <Name_Of_My_Model>> (response.Content.ReadAsStringAsync (). Resultado); La clase "Name_Of_My_Model" no se estableció en Public ni Private. Resulté que NECESITO establecer el "Name_Of_My_Model" (clase) en público para usarlo en un método "público" que tenía un decorador WebMethod encima para una llamada ajax que estaba haciendo.
Eric Milliot-Martinez
Aún más información Restricciones sobre el uso de niveles de accesibilidad (C #)
Alexei Levenkov
1
Y @ EricMilliot-Martinez, tu comentario me ayudó. También necesitaba agregar Public a una de mis clases. Gracias.
Fütemire
81

Haz pública la clase.

class NewClass
{

}

es lo mismo que:

internal class NewClass
{

}

entonces la clase tiene que ser pública

Nisha
fuente
27

Si parece que el tipo ACTInterfaceno lo es public, pero está usando la accesibilidad predeterminada de internal(si es de nivel superior) o private(si está anidado en otro tipo).

Darle al tipo el publicmodificador lo arreglaría.

Otro enfoque es hacer tanto el tipo como el método internal, si esa es su intención.

El problema no es la accesibilidad del campo ( oActInterface), sino del tipo en ACTInterfacesí.

Marc Gravell
fuente
9

¿Cuál es la accesibilidad del tipo support.ACTInterface? El error sugiere que no es público.

No puede exponer una firma de método público donde algunos de los tipos de parámetros de la firma no son públicos. No sería posible llamar al método desde afuera ya que la persona que llama no pudo construir los parámetros requeridos.

Si haces support.ACTInterfacepúblico eso eliminará este error. Alternativamente, reduzca la accesibilidad del método de formulario si es posible.

James Gaunt
fuente
4

El problema no parece ser con la variable sino con la declaración de ACTInterface. ¿Es ACTInterface declarado como interno por casualidad?

Craig W.
fuente
2

Cuando recibí este error, tenía una clase "auxiliar" que no declaró pública que causó este problema dentro de la clase que utilizaba la clase "auxiliar". Hacer pública la clase "ayudante" resolvió este error, como en:

Public ServiceClass {public ServiceClass (HelperClass _helper) {}}

public class HelperClass {} // Tenga en cuenta la HelperClass pública que resolvió mi problema.

Esto puede ayudar a alguien más que se encuentre con esto.

Keenan Stewart
fuente
2
parameter type 'support.ACTInterface' is less accessible than method    
'support.clients.clients(support.ACTInterface)' 

El error dice que 'support.ACTInterface' es menos accesible porque ha hecho que la interfaz sea privada, al menos hacerla interna o hacerla pública.

Harrish
fuente
1

Puede obtener el parámetro (clase que tiene menos accesibilidad) y objectluego convertirlo a su clase por aspalabra clave.

Sadeq Shajary
fuente
¿No te parece? podrías haber agregado esto como un comentario.
surajs1n
0

Si este error ocurre cuando quiere usar una variable de clase en una nueva forma, debe poner la definición de clase en

Formname.Designer.cs

en lugar del archivo Formname.cs.

ltsstar
fuente
0

Después de actualizar mi modelo de marco de entidad, encontré este error infectando varios archivos en mi solución. Simplemente hice clic derecho en mi archivo .edmx y mi archivo TT y hice clic en "Ejecutar herramienta personalizada" y eso me hizo volver justo después de reiniciar Visual Studio 2012.

Simon Kiely
fuente
-3

Intenta hacer que tu constructor sea privado así:

private Foo newClass = new Foo();
Yousri Mousa
fuente
Realmente no. Esto se debe a la protección anidada.
ForcedFakeLaugh