2009-10-27 9 views
7

Próbowałem uaktualnić aplikację ASP.Net z Visual Studio 2005 do 2008, i próbowałem kompilować tylko po to, aby sprawdzić, czy się skompiluje i otrzymałem ten błąd.Błąd niespójnej dostępności

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 

(usunąłem ścieżce klasy przed Web.Properties i Web.Ctrl, to zazwyczaj zawiera go)

kawałek kodu jego odsyłania jest

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

nie jestem dość pewnie, co ten błąd próbuje powiedzieć. Czy typ musi być rzutowany (nieprawidłowy rzut niejawny między dwoma niekompatybilnymi typami?) Lub czy jest to problem z pominięciem klasy?

Odpowiedz

23

Spójrz na następującą definicję. Wskazówka Foo jest widoczny dla każdego, a jego metoda publicznego GetBar jest również widoczny dla każdego, kto może zobaczyć Foo:

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

Oto definicja Bar:

internal class Bar {} 

Wskazówka Bar jest wewnętrzny do montażu, natomiast Foo jest widoczny dla wszystkich. Foo nie może wystawiać Bar na świat zewnętrzny, więc kompilator zgłasza ten wyjątek.

Innym przykładem może być:

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

Bar jest prywatny klasy z Foo i może być widoczny tylko przypadkach Foo. Foo nie może wystawiać tego typu na zewnątrz, więc kompilator zgłasza ten sam wyjątek.


Przykłady refaktoringu:

  1. podjęciu ukryty rodzaj publicznego

    public class Bar {} 
    public class Foo { public class Bar {} } 
    
  2. Encapsulation

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

    internal class Bar {} 
    internal class Foo { public class Bar {} } 
    
  4. Refactor ją

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

+1 Dobry przykład. –

+0

Oh ok, teraz dostaję o co chodzi w błędzie. Teraz większość tego kodu wygląda na wygenerowana przez edytor Visual Studio WYSIWYG, jak mam to naprawić? – tearman

+0

Cokolwiek próbujesz zrobić w tym publicznym akcesorium, prawdopodobnie jest złe. Musisz zmienić UITitleSettings na 1) uczynić go publicznym typem 2) zamknąć go w publicznym typie 3) zrobić wszystko wewnątrz lub 4) refactor UITitleSettings poza obrazem i odsłonić jego poszczególne części jako właściwości dostarczające prymitywy (standardowe typy systemów) . Mnóstwo sposobów na zrobienie tego; po prostu wybierz taki, który nie jest taki, jak teraz. – Will

0

Usunięcie "ścieżki klasy" nic nie da. Po prostu sprawiasz, że Twój kod jest mniej szczegółowy ... Sprawdź definicję właściwości.UITitleSettings. Będzie to prywatne lub chronione itp.

+0

Właśnie usunięto go ze względów prywatności ponad debugowanie przyczyny (po prostu chciałem wyjaśnić, że jego zwykle zawarta). Definicja właściwości.UITitleSettings jest wewnętrznie zaplombowany częściowy – tearman

Powiązane problemy