2016-05-25 15 views
1

私は内部プロパティを持つジェネリック型を持って許可されません継承:内部には、一般的なプロパティが内部型

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

をそれから私はIMyInterfaceの内部実装を持っている:

public interface IMyInterface { ... } 

internal class MyInternalClass: IMyInterface { ... } 

最後に私が持っていますpublicサブクラス:

public class MySubClass: 
    MyBaseClass<MyInternalClass> 
{ 
} 

この最終クラスでは、エラー:がスローされます。

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

両方ともタイプが publicであり、内部ジェネリックタイプは内部でのみ表示されます。

これはなぜですか?

そこにそれを回避する方法(publicするMyInternalClassを変える以外?)

+0

私は、アクセス修飾子を親のものよりも公開することができないことに関連していると思います。 – MaKCbIMKo

+0

@MaKCbIMKoはい、親は 'public'です – Keith

+0

' public abstract class MyBaseClass ここからT:IMyInterface'になります。この行は、クラス自体が 'public'なので' T'は 'public'だけであるかもしれないと言います。同じ理由で 'public abstract class 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の表面に露出してはなりません。これには、基本型と汎用型の引数が含まれます。

関連する問題