views:

1031

answers:

4

What is the difference between the "protected" and "protected internal" modifiers in .NET?

+7  A: 

protected

Members are only visible to inheriting types.

protected internal

Members are only visible to inheriting types and also to all types that are also contained within the same assembly as the declaring type.

Here is a C# example:

class Program
{
    static void Main()
    {
     Foo foo = new Foo();

     // Notice I can call this method here because
     // the Foo type is within the same assembly
     // and the method is marked as "protected internal".
     foo.ProtectedInternalMethod();

     // The line below does not compile because
     // I cannot access a "protected" method.
     foo.ProtectedMethod();
    }
}

class Foo
{
    // This method is only visible to any type 
    // that inherits from "Foo"
    protected void ProtectedMethod() { }

    // This method is visible to any type that inherits
    // from "Foo" as well as all other types compiled in
    // this assembly (notably "Program" above).
    protected internal void ProtectedInternalMethod() { }
}
Andrew Hare
Think you maybe missed 'internal' explanation....
Kev
Indeed. It's protected OR internal, contrary to how it looks in the first place +1
Mehrdad Afshari
+8  A: 

private

Access is only allowed from within a specific type

protected

private access is expanded to include inheriting types

internal

private access is expanded to include other types in the same assembly

And so it follows that:

protected internal

private access is expanded to allow access for types that either inherit from or are in the same assembly as this type, or both.

Basically, think of everything as private first, and anything else you see as expanding on that.

Joel Coehoorn
+1 That is a good way to think about it.
Andrew Hare
+1  A: 

As usual, from one of Fabulous Eric Lippert's blog posts:

Many people believe that [protected internal] means "M is accessible to all derived classes that are in this assembly." It does not. It actually means "M is accessible to all derived classes and to all classes in this assembly". That is, it is the less restrictive combination, not the more restrictive combination.

This is counterintuitive to a lot of people. I have been trying to figure out why, and I think I've got it. I think people conceive of internal, protected, and private as restrictions from the "natural" state of public. With that model, protected internal means "apply both the protected restriction and the internal restriction".

That's the wrong way to think about it. Rather, internal, protected and public are weakenings of the "natural" state of private. private is the default in C#; if you want to make something have broader accessibility, you've got to say so. With that model, then it becomes clear that protected internal is a weaker restriction than either alone.

Lucas