interno es la privacidad del ensamblaje (módulo estrictamente hablando). No tiene ningún efecto sobre la visibilidad del espacio de nombres.
La única forma de lograr la privacidad de una clase de otras clases dentro del mismo ensamblado es que una clase sea una clase interna.
En este punto, si la clase es privada, es invisible para cualquier cosa que no esté en esa clase o en la propia clase externa.
Si está protegido, es visible para todos los que podrían verlo cuando es privado, pero también es visible para las subclases de la clase externa.
public class Outer
{
private class Hidden { public Hidden() {} }
protected class Shady { public Shady() {} }
public class Promiscuous { public Promiscuous() {} }
}
public class Sub : Outer
{
public Sub():base()
{
var h = new Hidden();
var s = new Shady();
var p = new Promiscuous();
}
}
public class Outsider
{
public Outsider()
{
var h = new Outer.Hidden();
var s = new Outer.Shady()
var p = new Outer.Promiscuous();
}
}
En esencia, la única forma de lograr lo que desea es utilizar la clase externa como una forma de espacio de nombres y restringir dentro de esa clase.