我搜索过类似错误的答案,但一直找不到。此外,我知道如何修复错误(让所有公开 - 我真的不想做),但我真的不明白为什么这是不允许的。 无论如何 - 我得到了
可访问性不一致:属性类型 '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一样可访问?你们中的任何人都有一个很好的解决方法吗?
答案 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
继承?如果是这样,您需要使MultiSegmentBase
和SegmentBase
更易于访问,以便也可以在其他程序集中访问它们。