C# 不一致的可访问性不易访问
我已经搜索了类似错误的答案,但没有找到任何答案。此外,我知道如何修复错误(公开所有信息——我真的不想这么做),但我真的不明白为什么不允许这样做。 不管怎么说,我要走了 不一致的可访问性:属性类型 “E7XLibrary.Base.MultiSegmentBase”比属性更难访问 'E7XLibrary.E7XGroupBase.GroupSegment' 我的MultiSegmentBase类声明为内部类(SegmentBase类也是): 我在公共E7XGroupBase类中将MultiSegmentBase实例用作受保护的抽象属性:C# 不一致的可访问性不易访问,c#,C#,我已经搜索了类似错误的答案,但没有找到任何答案。此外,我知道如何修复错误(公开所有信息——我真的不想这么做),但我真的不明白为什么不允许这样做。 不管怎么说,我要走了 不一致的可访问性:属性类型 “E7XLibrary.Base.MultiSegmentBase”比属性更难访问 'E7XLibrary.E7XGroupBase.GroupSegment' 我的MultiSegmentBase类声明为内部类(SegmentBase类也是): 我在公共E7XGroupBase类中将MultiSegm
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的用户感到困惑。在这种情况下,拥有特雷弗建议的公共界面是一个好方法。