Il convient de noter qu'à l'origine, le C# ne vous permettait pas de définir des accès différents sur un getter ou un setter, de sorte que les seuls choix possibles étaient les suivants :
public string Name { get; set; }
protected internal string Name { get; set; }
internal string Name { get; set; }
protected string Name { get; set; }
private string Name { get; set; }
(D'ailleurs, il n'est pas possible d'avoir des propriétés automatiques et il faut toujours faire soi-même l'écriture vers et depuis un champ de sauvegarde, mais nous allons ignorer cela parce que nous aurons des exemples plus courts de cette façon).
Il est souvent utile d'avoir des accès différents pour les deux, le plus souvent un setter plus restrictif qu'un getter, et ainsi les exemples de
public string Name { get; private set; }
a été introduit.
Maintenant, par extension de cela, il semblerait assez logique de permettre :
public string Name { private get; private set; }
private string Name { private get; private set; }
Cependant, que sont ces deux expressions ?
Le second n'est pas trop mauvais, il est juste inutilement répétitif. Pourtant, il est fort probable qu'une réflexion confuse nous ait conduits là (très probablement une refactorisation incomplète). Un bon code consiste autant à exprimer ce que vous faites qu'à faire faire quelque chose à un ordinateur (voire plus), mieux vaut qu'il soit exprimé clairement.
Donc, si vous vous retrouvez avec des gens comme { private get; private set; }
alors cela vaudrait probablement la peine de le revoir et de réfléchir à ce que vous voulez vraiment dire ici. Heureusement que c'est une erreur de compilation.
Le premier cas est encore pire. Il dit "cette propriété est publique, sauf pour le setter qui est privé, et le getter qui est privé". Ce n'est pas une exception, "c'est cette chose, sauf tout le temps" n'est pas une expression réelle de quoi que ce soit. Doublement bravo au compilateur pour ne pas nous laisser faire.