2009-10-27 2 views
7

Я попробовал модернизировать приложение ASP.Net из Visual Studio 2005 до 2008 года, и я попробовал компиляцию, чтобы убедиться, что он будет компилироваться, и я получил эту ошибку.Непоследовательная ошибка доступности

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 

(я удалил путь к классу, прежде чем Web.Properties и Web.Ctrl, он обычно содержит его)

кусок кода его реферирование

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

Я не совсем уверен, что эта ошибка пытается сказать. Должен ли быть выбран тип (недействительный неявный приведение между двумя несовместимыми типами?) Или это проблема переопределения класса?

ответ

23

Посмотрите на следующее определение. Примечание Foo будет видно всем, а его публичный метод GetBar также виден всем, кто может увидеть Foo:

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

Вот определение Bar:

internal class Bar {} 

Уведомления Bar является внутренними для сборки, тогда как Foo видна для всех. Foo не может выставить Bar во внешний мир, поэтому компилятор выбрасывает это исключение.

Другой пример:

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

Bar является частным классом из Foo и может быть видны только экземпляры Foo. Foo не может выставить этот тип во внешний мир, поэтому компилятор выбрасывает одно и то же исключение.


Примеры рефакторинга:

  1. Сделать скрытый тип общественного

    public class Bar {} 
    public class Foo { public class Bar {} } 
    
  2. Инкапсуляция

    public class BarEncapsulator 
    { 
        private Bar _bar; 
        internal BarEncapsulator(Bar myBar) { _bar = myBar; } 
        public string BarString { get { return _bar.MyString; } } 
    } 
    
  3. Скрыть все

    internal class Bar {} 
    internal class Foo { public class Bar {} } 
    
  4. Refactor это далеко

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

+1 Хороший пример. –

+0

О, хорошо, теперь я понимаю, что такое ошибка. Теперь многие из этого кода выглядят так, как будто он был сгенерирован редактором Visual Studio WYSIWYG, как я могу это исправить? – tearman

+0

Что бы вы ни пытались сделать в этом общедоступном аксессоре, вероятно, неправильно. Вам нужно реорганизовать UITitleSettings либо: 1) сделать его общедоступным. 2) инкапсулировать его в открытый тип 3) сделать все внутреннее или 4) реорганизовать UITitleSettings из изображения и разоблачить его отдельные части как свойства, предоставляющие примитивы (стандартные типы систем) , Много способов сделать это; просто выберите тот, который не так, как вы сейчас это делаете. – Will

0

Удаление «пути класса» ничего не сделает. Вы просто делаете свой код менее подробным ... Проверьте определение свойств .UITitleSettings. Он будет закрыт или защищен и т. Д.

+0

Я просто удалить его из соображений конфиденциальности более чем отладки причин (просто хотел дать понять, что ее обычно содержатся). Определение свойств.UITitleSettings является внутренним закрытым частичным – tearman

Смежные вопросы