【问题标题】:Inconsistent Accessibility error不一致的辅助功能错误
【发布时间】:2009-10-27 17:47:04
【问题描述】:

我尝试将 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;
        }
    }

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

【问题讨论】:

    标签: c# visual-studio-2008


    【解决方案1】:

    看下面的定义。注意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 {} 
    }
    

    BarFoo私有类,并且只能对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; } }
      }
      

    【讨论】:

    • 哦,好的,现在我知道错误的全部内容了。现在很多代码看起来像是由 Visual Studio WYSIWYG 编辑器生成的,我该如何解决呢?
    • 无论您在该公共访问器中尝试做什么,都可能是错误的。您需要将 UITitleSettings 重构为 1) 使其成为公共类型 2) 将其封装在公共类型中 3) 使所有内容成为内部或 4) 从图片中重构 UITitleSettings 并将其各个部分公开为提供原语(标准系统类型)的属性.很多方法可以做到这一点;只需选择一个与您现在不同的方式即可。
    • 好吧,我认为这行得通。这似乎是一个级联的情况,所以我们只需要解决所有由此产生的问题。非常感谢
    【解决方案2】:

    默认界面是这样的

    Interface ICourseRepository{
    

    }

    改成

    Public Interface ICourseRepostory{
    

    }

    【讨论】:

      【解决方案3】:

      删除“类路径”不会做任何事情。你只是让你的代码不那么冗长...... 检查 Properties.UITitleSettings 的定义。它将是私有的或受保护的等。

      【讨论】:

      • 我只是出于隐私原因而不是调试原因将其删除(只是想明确它通常包含)。 Properties.UITitleSettings 的定义是内部密封部分
      猜你喜欢
      • 2022-11-30
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      相关资源
      最近更新 更多