【问题标题】:Inconsistent accessibility less accessible可访问性不一致 可访问性较差
【发布时间】:2015-07-01 12:53:00
【问题描述】:

我已经搜索过类似错误的答案,但没有找到任何答案。我也知道如何修复错误(公开所有内容 - 我真的不想这样做),但我真的不明白为什么不允许这样做。 无论如何 - 我得到了

可访问性不一致:属性类型 'E7XLibrary.Base.MultiSegmentBase' 比属性更难访问 'E7XLibrary.E7XGroupBase.GroupSegment'

我的 MultiSegmentBase 类被声明为内部类(SegmentBase 类也是如此):

internal class MultiSegmentBase : SegmentBase

我在我的公共 E7XGroupBase 类中使用 MultiSegmentBase 实例作为受保护的抽象属性:

public abstract class E7XGroupBase
{
    internal abstract UInt64 Length { get; }
    protected abstract MultiSegmentBase GroupSegment { get; }

    internal virtual void Wrap(BinaryWriter writer)
    {
        GroupSegment.Length = this.Length;
        GroupSegment.Wrap(writer);
    }
}

最后我有一个分开的公共类 E7XSessionGroup 类,它实现了抽象 E7XGroupBase,像这样

public class E7XSessionGroup : E7XGroupBase
{
    #region Properties
    private SessionGroupSegment _groupSegment = null;
    protected override MultiSegmentBase GroupSegment
    {
        get
        {
            if (_groupSegment == null)
                _groupSegment = new SessionGroupSegment();
            return _groupSegment;
        }
    }

正如我所说,我知道如果我只是将 MultiSegmentBase 声明为公共类而不是内部类,我不会出现此错误,但由于我正在制作 API,我不想公开 MultiSegmentBase 然后进一步从 MultiSegmentBase 派生的所有类。

基本上,我的问题是,当我只在受保护的属性中使用 MultiSegmentBase 时,为什么 MultiSegmentBase 需要像 E7XGroupBase 和 E7XSessionGroup 一样可访问?你们有什么好的解决方法吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    问题是你有一个public class 的公共属性是一个internal class

    public abstract class E7XGroupBase
    {
        protected abstract MultiSegmentBase GroupSegment { get; }
    }
    

    E7XGroupBase 可以由不同程序集中的类扩展(因为它是公共的),但扩展类无法解析 MultiSegmentBase 类,因为它被定义为内部。

    这可能有助于解释:

    组装 1:

    public abstract class E7XGroupBase
    internal class MultiSegmentBase : SegmentBase
    

    组装 2:

    public class Something : E7XGroupBase
    {
        // Can't resolve type MultiSegmentBase 
    }
    

    您要么需要公开MultiSegmentBase,要么为它创建一个公共接口并在E7XGroupBase 中使用它:

    public interface IMultiSegmentBase { }
    
    internal class MultiSegmentBase : IMultiSegmentBase {}
    
    public abstract class E7XGroupBase
    {
        protected abstract IMultiSegmentBase GroupSegment { get; }
    }
    

    【讨论】:

    • 但是当然——“但是那个扩展类不能解析 MultiSegmentBase” 没想到。非常感谢@Trevor Pilley
    【解决方案2】:

    这是因为 MultiSegmentBase 是内部的,这意味着它只能由同一程序集中的类访问。

    受保护意味着它只能被派生类访问。但是派生类确实必须位于同一个程序集中,这就是编译器给你这个错误的原因。

    【讨论】:

    • 感谢您抽出宝贵时间回复。我不确定您的建议是否能解决错误,因为错误是实现“GroupSegment”属性的类是公共的,但 MultiSegmentBase 类型是内部的。因此,任何从我的 E7XGroupBase 在程序集外继承的类都不知道如何实现 GroupSegment,因为它们不知道 MultiSegmentBase 类型。不,这是有道理的。
    • 你完全正确。我将删除我帖子中不相关的部分。我应该多喝咖啡。干杯!
    • 没问题 :-) 但再次感谢您抽出宝贵时间尝试帮助我。干杯
    【解决方案3】:

    protected abstract MultiSegmentBase GroupSegment { get; }

    是一个受保护的属性,这意味着它可以在E7XGroupBase 或派生自E7XGroupBase 的任何类型中访问,因为E7XGroupBase 是一个公共抽象类。 然而MultiSegmentBase 属性的类型是内部的,这意味着它只能在定义它的程序集中访问。

    如何解决这个问题取决于;另一个程序集中的类型是否应该能够从E7XGroupBase 继承?如果是这样,您需要使 MultiSegmentBaseSegmentBase 更易于访问,以便它们也可以在另一个程序集中进行访问。

    【讨论】:

    • 感谢您抽出宝贵时间回复。 “另一个程序集中的类型是否应该能够从 E7XGroupBase 继承” - 否 - 但程序集之外的类型应该能够使用/访问从 E7XGroupBase 派生的类。我宁愿不让 MultiSegmentBase 更容易访问。这会让我的 API 的用户感到困惑。
    • 在这种情况下,像 Trevor 建议的那样拥有一个公共接口是一个好方法。
    猜你喜欢
    • 1970-01-01
    • 2012-11-19
    • 2014-05-26
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多