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

C# 与抽象类不一致的可访问性,c#,public,internal,protected,access-modifiers,C#,Public,Internal,Protected,Access Modifiers,我有一个内部抽象类InternalClassBase和两个(也是内部)类InternalClass1和InternalClass2,它们继承自InternalClassBase 我还有一个公共抽象类PublicClassBase和两个(也是公共的)类PublicClass1和PublicClass2,它们继承自PublicClassBase PublicClassBase有一个类型为InternalClassBase的受保护成员XXX,因此PublicClass1和PublicClass2都可以

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

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

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

这是我的代码:

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
只能在
PublicClassBase
PublicClass1
PublicClass2
内可见,但不能在它之外

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


编辑-错误发生在PublicClassBase内的XXX声明处,异常消息是:可访问性不一致:字段类型“ClassLibrary2.InternalClassBase”的可访问性低于字段“ClassLibrary2.PublicClassBase.XXX”,但是,如何才能使protected比internal更易于访问呢?

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

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


您可以通过将字段
设置为private
,或将
PublicClassBase
及其子项
设置为internal
来解决此问题。如果您向我提供了一个包含上述类的程序集,我可以继续在引用您的程序集的不同程序集中创建
PublicClassBase
的子类


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

解决方法是将成员从
受保护的
更改为
internal