可访问性不一致的错误

tea*_*man 7 c# visual-studio-2008

我尝试将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
Run Code Online (Sandbox Code Playgroud)

(我在Web.Properties和Web.Ctrl之前删除了类路径,它通常包含它)

它引用的代码片段

public Properties.UITitleSettings UISettings
    {
        get
        {
            return _uiSettings;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我不太确定这个错误试图说的是什么.类型是否需要转换(两个不兼容的类型之间的隐式转换无效?)还是类覆盖问题?

小智 24

请看以下定义.通知Foo是可见的任何人,它的公共方法GetBar也可见于任何人谁可以看到Foo:

public class Foo 
{ 
    public Bar GetBar() { return new Bar(); } 
}
Run Code Online (Sandbox Code Playgroud)

这是以下定义Bar:

internal class Bar {}
Run Code Online (Sandbox Code Playgroud)

注意Bar程序集的内部,而Foo对所有人都可见. Foo无法暴露Bar给外界,所以编译器抛出此异常.

另一个例子是:

public class Foo 
{ 
    public Foo.Bar GetBar() { return new Bar(); } 
    private class Bar {} 
}
Run Code Online (Sandbox Code Playgroud)

Bar是一个私有类,Foo只能对实例可见Foo. Foo无法将此类型公开给外界,因此编译器会抛出相同的异常.


重构的例子:

  1. 将隐藏类型设为公开

    public class Bar {}
    public class Foo { public class Bar {} }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 封装

    public class BarEncapsulator
    {
      private Bar _bar;
      internal BarEncapsulator(Bar myBar) { _bar = myBar; }
      public string BarString { get { return _bar.MyString; } }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 隐藏一切

    internal class Bar {}
    internal class Foo { public class Bar {} }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 重构它

    public class BarEncapsulator
    {
      private string _barString;
      public string BarString { get { return _barString; } }
    }
    
    Run Code Online (Sandbox Code Playgroud)