Someone posted a comment in the internal alias on protected member access. The question is that the following code does not compile with the error "cannot access protected member Class1.Foo()"

public class Class1

{

protected void Foo()

{

}

}

public class Class2 : Class1

{

private void Test()

{

Class2 a = new Class2();

Class1 b = new Class2();

a.Foo();

b.Foo(); // Fails to compile

}

}

The argument that this code should work is that since Class1 is the base class of Class2 the access should be allowed. Long back (in another life) I had seen the same issue in C++. This is what I replied to the question....

The same issue exists in C++ as well, I think similar rationale will exist for C#. The following C++ code won’t compile as well

class Class1

{

protected:

void Foo ()

{

}

};

class Class2 : public Class1

{

public:

void Test ()

{

Class2* a = new Class2 ();

Class1* b = new Class2 ();

a->Foo();

b->Foo();

}

};

This is because b is pointer (or reference) to a base class. For all we know b could point to an object of any class derived from Class1. If this call was allowed then it would break encapsulation as you would get access to a method inside the derived class