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

C# 不一致的可访问性不易访问,c#,C#,我已经搜索了类似错误的答案,但没有找到任何答案。此外,我知道如何修复错误(公开所有信息——我真的不想这么做),但我真的不明白为什么不允许这样做。 不管怎么说,我要走了 不一致的可访问性:属性类型 “E7XLibrary.Base.MultiSegmentBase”比属性更难访问 'E7XLibrary.E7XGroupBase.GroupSegment' 我的MultiSegmentBase类声明为内部类(SegmentBase类也是): 我在公共E7XGroupBase类中将MultiSegm

我已经搜索了类似错误的答案,但没有找到任何答案。此外,我知道如何修复错误(公开所有信息——我真的不想这么做),但我真的不明白为什么不允许这样做。 不管怎么说,我要走了

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

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

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

internal class MultiSegmentBase : SegmentBase
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一样可访问?你们中有谁有一个好的解决方法吗?

问题是,你们有一个
公共类
,其公共属性是
内部类

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是内部的,这意味着它只能由同一程序集中的类访问


受保护意味着它只能由派生类访问。但是派生类必须位于同一个程序集中,这就是为什么编译器会给您这个错误。

受保护的抽象多段基GroupSegment{get;}

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


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

但是当然-“但是扩展类无法解析MultiSegmentBase”没有想到这一点。非常感谢@Trevor Pilley感谢您抽出时间回复。我不确定您的建议是否能解决这个错误,因为错误在于实现“GroupSegment”属性的类是公共的,而MultiSegmentBase类型是内部的。因此,任何从程序集外部的E7XGroupBase继承的类都不知道如何实现GroupSegment,因为它们不知道MultiSegmentBase类型。不,这是有道理的。你完全正确。我将删除我帖子中不相关的部分。我应该多喝点咖啡。干杯没问题:-)不过,再次感谢你抽出时间来帮助我。感谢您抽出时间回复。“另一个程序集中的类型是否应该能够从E7XGroupBase继承”-否-但是程序集之外的类型应该能够使用/访问从E7XGroupBase派生的类。我宁愿不让多段库更容易访问。这会让我的API的用户感到困惑。在这种情况下,拥有特雷弗建议的公共界面是一个好方法。