I have an internal abstract class InternalClassBase and two (also internal) classes InternalClass1 and InternalClass2, which inherit from InternalClassBase.
I also have a public abstract class PublicClassBase and two (also public) classes PublicClass1 and PublicClass2, which inherit from PublicClassBase.
The PublicClassBase has a protected member XXX of type InternalClassBase, so both PublicClass1 and PublicClass2 can use it.
This is my code:
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 { }
Why can’t PublicClassBase contain the XXX member in my example? I thought that XXX would only be visible within PublicClassBase, PublicClass1 and PublicClass2, but not outside of it.
I also thought that I understand access modifiers, but obviously I don’t 🙂
Edit – the error happens at declaration of XXX inside PublicClassBase, and the exception message is: Inconsistent accessibility: field type ‘ClassLibrary2.InternalClassBase’ is less accessible than field ‘ClassLibrary2.PublicClassBase.XXX’, but how can protected be more accessible then internal?
Imagine that in an assembly other than the one types from your example are declared, you declare class
PublicClass3that inherits fromPublicClassBase. The fieldXXXshould be visible fromPublicClass3, since it is protected, but the type of the field is internal, so at the same time, it should not be visible fromPublicClass3.Obviously, you cannot have both, hence the error.
You can solve this either by making your field
private, or makingPublicClassBaseand its childreninternal.