2009-10-27 14 views
7

Intenté actualizar una aplicación ASP.Net desde Visual Studio 2005 a 2008, e intenté compilar solo para verificar que se compilaría y recibí este error.Error de accesibilidad incoherente

Error 1 Inconsistent accessibility: property type 'Web.Properties.UITitleSettings' is less accessible than property 'Web.Ctrl.BasePanel.UISettings' \\projectLocation\Ctrl\BasePanel.cs 25 43 ProjectName 

(I eliminado la ruta de clase antes de Web.Properties y Web.Ctrl, que normalmente lo contiene)

La pieza de código de referencia es su

public Properties.UITitleSettings UISettings 
    { 
     get 
     { 
      return _uiSettings; 
     } 
    } 

No estoy muy seguro de lo que este error está tratando de decir. ¿El tipo debe ser copiado (conversión implícita inválida entre dos tipos incompatibles?) O es un problema de anulación de clase?

Respuesta

23

Mire la siguiente definición. Aviso Foo es visible para cualquiera, y su método público GetBar también es visible para cualquiera que pueda ver Foo:

public class Foo 
{ 
    public Bar GetBar() { return new Bar(); } 
} 

Ésta es la definición de Bar:

internal class Bar {} 

Aviso Bar es interno para el montaje, mientras que Foo es visible para todos. Foo no puede exponer Bar al mundo exterior, por lo que el compilador arroja esta excepción.

Otro ejemplo sería:

public class Foo 
{ 
    public Foo.Bar GetBar() { return new Bar(); } 
    private class Bar {} 
} 

Bar es una clase privada de Foo y sólo puede ser visible a los casos de Foo. Foo no puede exponer este tipo al mundo exterior, por lo que el compilador arroja la misma excepción.


Ejemplos de refactorización:

  1. hacer que el tipo oculto pública

    public class Bar {} 
    public class Foo { public class Bar {} } 
    
  2. encapsulación

    public class BarEncapsulator 
    { 
        private Bar _bar; 
        internal BarEncapsulator(Bar myBar) { _bar = myBar; } 
        public string BarString { get { return _bar.MyString; } } 
    } 
    
  3. esconder todo

    internal class Bar {} 
    internal class Foo { public class Bar {} } 
    
  4. Refactor lejos

    public class BarEncapsulator 
    { 
        private string _barString; 
        public string BarString { get { return _barString; } } 
    } 
    
+0

+1 Buen ejemplo. –

+0

Oh, bien, ahora entiendo de qué se trata el error. Ahora que gran parte de este código parece haber sido generado por el editor WYSIWYG de Visual Studio, ¿cómo podría solucionarlo? – tearman

+0

Lo que sea que estés tratando de hacer en ese acceso público probablemente sea incorrecto. Necesita volver a configurar UITitleSettings para 1) convertirlo en un tipo 2 público) encapsularlo en un tipo público 3) hacer que todo sea interno o 4) refactorizar las configuraciones de UITitle fuera de la imagen y exponer sus partes individuales como propiedades que entregan primitivas (tipos de sistema estándar) . Muchas formas de hacerlo; solo elige uno que no sea como lo estás haciendo ahora. – Will

0

Eliminar la "ruta de clase" no hará nada. Solo está haciendo que su código sea menos detallado ... Compruebe la definición de Properties.UITitleSettings. Será privado o protegido, etc.

+0

me acaba de quitar que por razones de privacidad más de depuración razones (sólo quería dejar claro que su contenido normalmente). La definición de Propiedades.UITitleSettings es sellado interno parcial – tearman

Cuestiones relacionadas