Not true.
C# does allow you to change accessibility of base class items in a
derived class, but with caveats.
First, (perhaps obviously) you can widen access. You can override a
protected base class item and declare the override public in the
derived class.
Second, (and I think this is what Edward was asking), you can use the
"new" keyword to indicate that your derived class has a new
implementation for a base class item. The "new" derived item can have
any access at all, including (usually) narrower access. So if you have
a protected method in your base class, you can declare that same method
with the "new" keyword in your derived class and make it private.
However, it's not that simple.
Because the "new" derived class method is not an override (it's a
redefinition), if someone casts your derived class object to its base
class, then the base class method will be called instead of the derived
class method. Remember: the "new" derived class method is not an
override and does not create polymorphic behaviour. For example:
class A
{
public virtual int Add(int a, int b)
{ ... }
}
class B : A
{
public new int Add(int a, int b)
{ ... }
}
B aB = new B();
int x = aB.Add(1, 2);
A anA = aB;
int y = anA.Add(1, 2);
In this example, the first call to aB.Add() would call B.Add. The
second call, anA.Add, would call A.Add(). If B.Add had been declared
"public override" instead of "public new", both calls would have
invoked B.Add().
You can, of course, declare B.Add "private new" or give it whatever
access level you like.