2016-05-25 32 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表面上暴露出来。这包括基本类型和泛型类型参数。