与抽象类的可访问性不一致

Posted

技术标签:

【中文标题】与抽象类的可访问性不一致【英文标题】:Inconsistent accessibility with abstract classes 【发布时间】:2012-08-06 14:47:39 【问题描述】:

我有一个内部抽象类InternalClassBase 和两个(也是内部的)类InternalClass1InternalClass2,它们继承自InternalClassBase

我还有一个公共抽象类PublicClassBase 和两个(也是公共的)类PublicClass1PublicClass2,它们继承自PublicClassBase

PublicClassBase 有一个 XXX 类型为 InternalClassBase 的受保护成员,因此 PublicClass1PublicClass2 都可以使用它。

这是我的代码:

internal abstract class InternalClassBase  
internal class InternalClass1 : InternalClassBase  
internal class InternalClass2 : InternalClassBase  

public abstract class PublicClassBase

    protected InternalClassBase XXX;  // this is where the error happens

public class PublicClass1 : PublicClassBase  
public class PublicClass2 : PublicClassBase  

为什么在我的示例中PublicClassBase 不能包含XXX 成员?我以为XXX 只能在PublicClassBasePublicClass1PublicClass2 内可见,而不能在其外部可见。

我也认为我了解访问修饰符,但显然我不了解:)

编辑 - 错误发生在 PublicClassBase 内声明 XXX 时,异常消息是:不一致的可访问性:字段类型 'ClassLibrary2.InternalClassBase' 比字段 'ClassLibrary2.PublicClassBase.XXX' 的可访问性更小,但如何保护更多可访问然后是内部的?

【问题讨论】:

【参考方案1】:

想象一下,在一个程序集中 其他 不是您的示例中声明的一种类型,您声明的类 PublicClass3 继承自 PublicClassBase。字段XXX 应该从PublicClass3 可见,因为它是受保护的,但是字段的类型是内部的,所以同时它应该PublicClass3 可见。

显然,您不能同时拥有两者,因此会出现错误。

您可以通过将字段设为private 或将PublicClassBase 及其子字段设为internal 来解决此问题。

【讨论】:

解决方法是将成员从protected 更改为internal【参考方案2】:

鉴于您提供给我的程序集,其中包含上述类,我可以继续在引用您的程序集的不同程序集中创建 PublicClassBase 的子类。

在那个类中,我必须实现 InternalClassBase 类型的受保护成员 XXX - 显然我不能,因为 InternalClassBase 被标记为 internal

【讨论】:

以上是关于与抽象类的可访问性不一致的主要内容,如果未能解决你的问题,请参考以下文章

如何避免类和方法的可访问性不一致导致的编译错误?

可访问性不一致:字段类型“世界”比字段“frmSplashScreen”更难访问

c#错误不一致的可访问性:参数类型'HRDMSV1.User'比方法更难访问

可访问性不一致:属性类型错误

可访问性不一致:参数类型比方法更难访问

错误 1 ​​可访问性不一致:返回类型比方法更难访问