2015-04-23 84 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上面建議的公共接口是一種好方法。 –