interno è la privacy dell'assemblaggio (modulo in senso stretto). Non ha alcun effetto sulla visibilità dello spazio dei nomi.
L'unico modo per ottenere la privacy di una classe da altre classi all'interno dello stesso assembly è che una classe sia una classe interna.
A questo punto, se la classe è privata, è invisibile a qualsiasi cosa non in quella classe o nella stessa classe esterna.
Se protetto è visibile a tutti coloro che potrebbero vederlo quando è privato, ma è anche visibile alle sottoclassi della classe esterna.
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();
}
}
In sostanza, l'unico modo per ottenere ciò che desideri è usare la classe esterna come una forma di spazio dei nomi e limitare all'interno di quella classe.