2010-09-08 17 views
12

Tengo tres clases. todos son parte del mismo espacio de nombres. aquí están los conceptos básicos de las tres clases.La clase es inaccesible debido a su nivel de protección

//FBlock.cs 
namespace StubGenerator.PropGenerator 
{ 
    class FBlock : IDesignRegionInserts, IFormRegionInserts, IAPIRegionInserts, IConfigurationInserts, ISoapProxyClientInserts, ISoapProxyServiceInserts 
    { 
     private List<Property> pProperties; 
     private List<Method> pMethods; 
     public FBlock(string aFBlockName) 
     { 
      pProperties = new List<Property>(); 
      pMethods = new List<Method>(); 
     } 

     public Property AddProperty(string aName) 
     { 
      Property loProp = new Property(this, aName, pProperties.Count); 
      pProperties.Add(loProp); 
      return loProp; 
     } 

     public Method AddMethod(string aName) 
     { 
      Method loMeth = new Method(this, aName); 
      pMethods.Add(loMeth); 
      return loMeth; 
     } 
    } 

//Method.cs 
namespace StubGenerator.PropGenerator 
{ 
    class Method : IPropertyName 
    { 
     private List<StubGenerator.PropGenerator.PropertyAttribute> pPropertyAttributes; 
     private string pName; 
     private string pFBlockName; 

     public Method(FBlock aFBlock,string aName) 
     { 
      pPropertyAttributes = new List<PropertyAttribute>(); 
      pName = aName; 
      pFBlockName = aFBlock.Name; 
     } 
     } 
} 

//Property.cs 
namespace StubGenerator.PropGenerator 
{ 
    class Property : StubGenerator.PropGenerator.IPropertyName, StubGenerator.PropGenerator.IDesignRegionInserts, StubGenerator.PropGenerator.IFormRegionInserts, IAPIRegionInserts, IConfigurationInserts, ISoapProxyClientInserts, ISoapProxyServiceInserts 
    { 
     private string pName; 
     private string pExpandedName; 
     private string pFBlockInitials; 

     private Group pPropertyGroup; 
     private FlowLayoutPanel pGroupFlowPanel; 
     private Button pUpdateButton; 
     private CheckBox pShowProperty; 


     private string pFBlockName; 


     public Property(FBlock aFBlock, string aName, int aIndex) 
     { 
      pPropertyAttributes = new List<PropertyAttribute>(); 
      pFBlockName = aFBlock.FBlockName; 

      ExpandName(); 
      GetInitials(); 

      pShowProperty = new CheckBox(this, 10, (aIndex + 1) * 20, aIndex); 
      pPropertyGroup = new Group(this); 
      pGroupFlowPanel = new FlowLayoutPanel(this); 

      pUpdateButton = new Button(this, 10, 18, aIndex); 
     } 
    } 
} 

estoy recibiendo los errores siguientes

'StubGenerator.PropGenerator.Method' es inaccesible debido a su nivel de protección

que se refiere a la siguiente línea en el FBlock. archivo cs

private List<Method> pMethods; 

y

'StubGenerator.PropGenerator.Method' es inaccesible debido a su nivel de protección

que se refiere a la siguiente línea en el archivo los FBlock.cs

public Method AddMethod(string aName) 

y

Accesibilidad incoherente: el tipo de devolución 'StubGenerator.PropGenerator.Method' es menos accesible que el método 'StubGenerator.PropGenerator .FBlock.AddMethod (cadena)'

que se refiere a la siguiente línea en los FBlock.cs presentar

public Method AddMethod(string aName) 

hacer público el método de clase no resuelve los errores. No puedo entender por qué no obtengo los errores cuando llamo a la clase Propiedad. Y no entiendo por qué hacer que la clase Method sea pública no soluciona el problema.

¿Alguna idea?

Editado para preguntar. ¿Podría haber alguna configuración en el archivo que causa esto?

+1

¿Cambia algo si declaras explícitamente públicas las clases principales? – Bobby

+0

El constructor 'Property' hace referencia a un campo' pPropertyAttributes' que no existe. Es evidente que no ha publicado el código que produce los errores que reclama. – Timwi

+0

¿Es un error de copiar y pegar que falta un} al final de la definición de FBlock? Como está listado actualmente, la primera declaración del espacio de nombres no está cerrada. – epotter

Respuesta

7

Hubo un proyecto que usó archivos vinculados. Necesitaba agregar el archivo method.cs a ese proyecto como un archivo vinculado también, ya que el archivo FBlock.cs estaba allí. Nunca había escuchado sobre archivos vinculados antes, ni siquiera sabía que eso fuera posible.

+3

Sí, la opción de agregar archivos vinculados está muy bien escondida en Visual Studio. Si alguien la busca, está en el cuadro de diálogo agregar archivo existente, el botón Agregar tiene una pequeña flecha para agregar el archivo como un enlace en lugar de copiarlo. –

2

El código que ha publicado no genera los mensajes de error que citó. Debe proporcionar un ejemplo (pequeño) que realmente muestre el problema.

+2

¿No debería ser este un comentario? – NullUserException

+3

@NullUserException: Lo consideré, pero tal como está, en realidad es la respuesta a la pregunta :) – Timwi

0

Supongo que public Method AddMethod(string aName) se define en una interfaz pública que implementa FBlock. Los consumidores de esa interfaz no tienen garantizado el acceso al Método.

+0

Si ese fuera el caso, el compilador se quejaría de ello en la declaración de interfaz. – Timwi

+0

Lo sé, pero como usted indica, el código dado no da ningún error, por lo que obviamente se ha omitido algo de la pregunta. Como dije, solo una (educada) suposición. – Bubblewrap

+0

No existe en ninguna de las interfaces públicas que implementa FBlock. He incluido todo el código al que hace referencia cualquiera de los errores. No incluí todo el código porque sería una pregunta muy larga. Todo el código que agregué desde la última compilación se incluye en la pregunta. – scott

2

Todas las clases son internal por defecto

Marcado public no hacer el truco.

¿Estás seguro de que no tienes dos clases llamadas Method, y quizás incluyan la clase de método incorrecta?

+3

Las clases no anidadas no se pueden proteger. Son 'internos' por defecto. – Timwi

+0

Oye, tienes razón. ¡Aprendí otra cosa hoy! – Arcturus

+0

las tres clases están en el mismo conjunto. Entonces, no deberían necesitar ser públicos, ¿verdad? – scott

20

Primero, intente una reconstrucción completa. Limpiar y construir (o simplemente usar reconstrucción). De vez en cuando, eso resuelve problemas de construcción extraños para mí.

A continuación, comente el resto del código que no está en su ejemplo que ha publicado. Compilar. ¿Eso funciona?

Si es así, comience a agregar segmentos de nuevo hasta que se rompa.

Si no, realice todas las clases public y vuelva a intentarlo.

Si eso no funciona, tal vez intente colocar las clases recortadas en el mismo archivo y reconstruirlas. En ese punto, no habría absolutamente ninguna razón para problemas de acceso. Si eso aún falla, toma carpintería.

+2

Para mi sorpresa, esto (reconstrucción) funcionó para mí. Supongo que he dejado de esperar que las compilaciones incrementales se estropeen :( – Legolas

2

También puede ocurrir que la biblioteca que contiene la clase en cuestión no esté debidamente firmada con un nombre seguro.

4

Trate de añadir el siguiente código a la clase que desea utilizar

[Serializable()] 
public partial class Class 
{ 
0

Hola Es necesario cambiar las propiedades del botón de privado a público. Puede cambiar debajo del botón >> propiedades >> Diseño >> Modificadores >> "público" Una vez que cambie, el error de protección desaparecerá.

Budi

Cuestiones relacionadas