2015-04-23 39 views
1

我已经搜索了类似错误的答案,但一直未能找到任何答案。另外我知道如何解决这个错误(让所有的公众 - 我不想这么做),但我不明白为什么这是不允许的。 反正 - 我越来越不一致的可访问性不易访问

可访问性不一致:属性类型 'E7XLibrary.Base.MultiSegmentBase' 比财产较少访问 'E7XLibrary.E7XGroupBase.GroupSegment'

我MultiSegmentBase类被声明作为内部类(以及SegmentBase类):

internal class MultiSegmentBase : SegmentBase 

我使用MultiSegmentBase实例作为受保护的抽象p roperty在我的公开E7XGroupBase类:

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); 
    } 
} 

而且最后我有一个devided公共类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需要像E7XGroupBase和E7XSessionGroup一样可访问,当时我只在受保护的属性中使用MultiSegmentBase?你们有没有一个好的解决方法?

回答

5

的问题是你有一个public class具有公共的财产这是一个internal class

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

的E7XGroupBase可以通过一个类中不同的装配延长(因为它是公众),但延长类couldn” t解决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; } 
} 
+0

但当然 - “但扩展类无法解决MultiSegmentBase”没有想到这一点。非常感谢@Trevor Pilley – Viking

2

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

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

+0

感谢您花时间回复。我不确定您的提案是否会解决错误,因为错误在于实现“GroupSegment”属性的类是公共的,但MultiSegmentBase类型是内部的。因此,从程序集外部继承我的E7XGroupBase的任何类都不知道如何实现GroupSegment,因为它们不知道MultiSegmentBase类型。没有这是有道理的。 – Viking

+0

你是完全正确的。我将删除我的帖子的不相关部分。我应该喝更多的咖啡。干杯! – sszarek

+0

没问题:-)但是,再次感谢您花时间尝试和帮助我。干杯 – Viking

0

protected abstract MultiSegmentBase GroupSegment { get; }

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

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

+0

感谢您花时间回复。 “另一个程序集中的类型是否应该能够从E7XGroupBase继承” - 否 - 但程序集外部的类型应该能够使用/访问从E7XGroupBase派生的类。我宁愿不让MultiSegmentBase更易于访问。它会混淆我的API的用户。 – Viking

+0

在这种情况下,具有Trevor上面建议的公共接口是一种好方法。 –

相关问题