In questi giorni sto scrivendo una libreria, è la prima volta che mi trovo di fronte a questo tipo di sviluppo, che comporta la scelta accurata degli accessors per classi e metodi, al fine di mostrare soltanto l'API che mi interessa allo sviluppatore terzo che dovrà utilizzare questa libreria.
Ebbene proprio qualche minuto fa ho scoperto che l'accessor "protected internal" in c# significa in pratica "protected OR internal" e che non esiste alcun concetto di "protected AND internal".
Sinceramente mi domando il perchè. Quello che a me servirebbe sarebbe proprio la composizione di protected ed internal: ho un membro di una classe base (la cui gerarchia arriva ad avere 6 foglie) che vorrei marcare protected in modo che le classi derivate vi possano accedere, ma solo quelle all'interno dell'assembly che sto sviluppando. Non voglio che tale membro sia accessibile dalle classi che lo sviluppatore terzo potrebbe creare derivando a sua volta dalla classe base di cui sopra o da qualcuna delle sue foglie cmq definite nel mio assembly.
Con un approccio "protected OR internal" cmq lo sviluppatore terzo potrebbe accedere tramite derivazione al membro che ho definito.
Un'altra questione è quella per cui il membro che vorrei nascondere all'esterno è di un tipo che ho definito internal (il tipo in questione deve rimanere interno alla libreria, all'esterno non se ne deve avere sentore), in questo caso non posso marcare il mebro nemmeno come "protected internal" perchè ovviamente il suo tipo essendo solo internal non sarebbe visibile all'esterno, quindi le classi derivate esterne in teoria non hanno conoscenza di tale tipo, quindi come potrebbero accedere al membro marcato anche come protected? Infatti viene sollevato un errore di compilazione (protected ha una visibilità extra-assembly, internal ovviamente no).
Potrei impedire la derivazione verso l'esterno, ma non è quello che voglio fare....
Insomma il concetto di "protected AND internal" sarebbe comodo, almeno nel mio caso.
saluti