不一致的可访问性不易访问

时间:2015-04-23 11:12:02

标签: c#

我搜索过类似错误的答案,但一直找不到。此外,我知道如何修复错误(让所有公开 - 我真的不想做),但我真的不明白为什么这是不允许的。 无论如何 - 我得到了

  

可访问性不一致:属性类型   '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一样可访问?你们中的任何人都有一个很好的解决方法吗?

3 个答案:

答案 0 :(得分:5)

问题是您的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; }
}

答案 1 :(得分:2)

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

受保护意味着它只能由派生类访问。但派生类必须位于同一个程序集中,这就是编译器为您提供此错误的原因。

答案 2 :(得分:0)

protected abstract MultiSegmentBase GroupSegment { get; }

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

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