2016-05-25 71 views
1

我有一個泛型類型的內部屬性:內部繼承通用屬性不會允許內部類型

public abstract class MyBaseClass<T> 
    where T: IMyInterface 
{ 
    internal T MyProp { get; } 
} 

然後,我有一個內部實現的IMyInterface

public interface IMyInterface { ... } 

internal class MyInternalClass: IMyInterface { ... } 

最後我有一個公共子類:

public class MySubClass: 
    MyBaseClass<MyInternalClass> 
{ 
} 

這最後一類拋出一個錯誤:

Inconsistent accessibility: base class MyBaseClass<MyInternalClass> is less accessible than class MySubClass

只有兩種類型都是public,並且內部泛型類型只在內部可見。

這是爲什麼?

它有辦法解決它(不是改變MyInternalClass其他是public?)

+0

我認爲這與無法將訪問修飾符設置爲比父級訪問修飾符更公共有關。 – MaKCbIMKo

+0

@MaKCbIMKo是的,但父母是'公共' – Keith

+0

它從'公共抽象類MyBaseClass 其中T:IMyInterface'。這一行說「T」可能只是「公開」的東西,因爲這個類本身是「公共」的。你甚至不能通過相同的原因寫'公共抽象類MyBaseClass 其中T:MyInternalClass'。 – MaKCbIMKo

回答

0

我不認爲它周圍有一個直接的方式。對我來說,它聞起來像是代碼分享的繼承錯誤,但我無法確定。

你不能把內部東西放在一個完全內部的幫助對象上嗎?

class InternalHelper<T> { 
internal T MyProp { get; } 
} 

public class MySubClass 
{ 
InternalHelper<MyInternalClass> helper; 
} 

現在,不再需要公開API表面區域中的泛型。

如果要暴露接口類型的屬性,你可以添加:

public IMyInterface MyProp => helper.MyProp; 

一般來說,內部元件不應該永遠公共API表面上暴露出來。這包括基本類型和泛型類型參數。