Несогласованная ошибка доступности - PullRequest
7 голосов
/ 27 октября 2009

Я попытался обновить приложение 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;
        }
    }

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

Ответы [ 2 ]

24 голосов
/ 27 октября 2009

Посмотрите на следующее определение. Уведомление 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. Рефакторинг его

    public class BarEncapsulator
    {
      private string _barString;
      public string BarString { get { return _barString; } }
    }
    
0 голосов
/ 27 октября 2009

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

...