2009-10-27 7 views
7

Ich habe versucht, eine ASP.Net-Anwendung von Visual Studio 2005 auf 2008 zu aktualisieren, und ich habe versucht zu kompilieren, nur um zu überprüfen, dass es kompilieren würde und ich diesen Fehler empfing.Inkonsistenter Accessibility Fehler

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 

(Ich entfernte den Klassenpfad vor Web.Properties und Web.Ctrl, enthält es normalerweise)

Das Stück Code seiner Referenzierung

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

ist bin ich nicht ganz Sicher, was dieser Fehler versucht zu sagen. Muss der Typ umgesetzt werden (ungültige implizite Umwandlung zwischen zwei inkompatiblen Typen?) Oder handelt es sich um ein Klassenüberschreibungsproblem?

Antwort

23

Schauen Sie sich die folgende Definition an. Hinweis Foo ist für jeden sichtbar, und seine öffentliche Methode GetBar ist auch sichtbar für jeden, der Foo sehen:

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

Hier ist die Definition von Bar:

internal class Bar {} 

Hinweis Bar ist intern in der Montage, während Foo für alle sichtbar ist. Foo kann Bar nicht nach außen offen legen, so dass der Compiler diese Ausnahme auslöst.

würde Ein anderes Beispiel sein:

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

Bar eine private Klasse von Foo ist und nur in Fällen von Foo sichtbar sein kann. Foo kann diesen Typ nicht der Außenwelt aussetzen, daher löst der Compiler dieselbe Ausnahme aus.


Beispiele für Refactoring:

  1. den verborgenen Typ

    öffentlich machen
    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. alles ausblenden

    internal class Bar {} 
    internal class Foo { public class Bar {} } 
    
  4. Umgestalten es

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

+1 Schönes Beispiel. –

+0

Oh ok, jetzt verstehe ich, worum es bei dem Fehler geht. Nun sieht ein Großteil dieses Codes so aus, als wäre er vom Visual Studio WYSIWYG-Editor erstellt worden. Wie würde ich das beheben? – tearman

+0

Was auch immer Sie in diesem öffentlichen Accessor versuchen, ist wahrscheinlich falsch. Sie müssen UITitleSettings entweder umgestalten 1) es zu einem öffentlichen Typ machen 2) es in einen öffentlichen Typ kapseln 3) alles intern machen oder 4) UITitleSettings aus dem Bild umstrukturieren und seine einzelnen Teile als Eigenschaften darstellen, die Primitive liefern (Standard-Systemtypen) . Viele Möglichkeiten, es zu tun; wählen Sie einfach eine, die nicht so ist, wie Sie es jetzt tun. – Will

0

Das Entfernen des "Klassenpfads" wird nichts bewirken. Sie machen nur Ihren Code weniger ausführlich ... Überprüfen Sie die Definition von Properties.UITitleSettings. Es wird privat oder geschützt etc.

+0

weg mehr entfernte ich es nur aus Datenschutzgründen als Gründe Debuggen (wollte nur deutlich machen, dass seine normalerweise enthalten). Die Definition von Eigenschaften.UITitleSettings ist intern versiegelt teilweise – tearman

Verwandte Themen