ATUALIZAÇÃO: Esta questão foi o assunto do meu blog em setembro de 2014 . Obrigado pela ótima pergunta!
Há um debate considerável sobre essa questão, mesmo dentro da própria equipe do compilador.
Primeiro, é aconselhável entender as regras. Um membro público de uma classe ou estrutura é um membro acessível a qualquer coisa que possa acessar o tipo de contenção . Portanto, um membro público de uma classe interna é efetivamente interno.
Então agora, dada uma classe interna, os membros que você deseja acessar na assembléia devem ser marcados como públicos ou internos?
Minha opinião é: marque esses membros como públicos.
Eu uso "público" para significar "este membro não é um detalhe de implementação". Um membro protegido é um detalhe de implementação; há algo sobre isso que será necessário para fazer uma classe derivada funcionar. Um membro interno é um detalhe de implementação; outra coisa interna a esta montagem precisa do membro para funcionar corretamente. Um membro público diz "esse membro representa a funcionalidade documentada chave fornecida por esse objeto".
Basicamente, minha atitude é: suponha que decidi transformar essa classe interna em pública. Para fazer isso, quero mudar exatamente uma coisa : a acessibilidade da classe. Se transformar uma classe interna em uma classe pública significa que eu também preciso transformar um membro interno em um membro público, esse membro fazia parte da área pública da classe e deveria ter sido público em primeiro lugar.
Outras pessoas discordam. Há um contingente que diz que eles querem poder dar uma olhada na declaração de um membro e saber imediatamente se ela será chamada apenas a partir do código interno.
Infelizmente, isso nem sempre funciona bem; por exemplo, uma classe interna que implementa uma interface interna ainda precisa ter os membros de implementação marcados como públicos, porque fazem parte da superfície pública da classe .