J'ai tendance à privilégier les implémentations explicites des interfaces par rapport aux implémentations implicites, car je pense qu'il est généralement préférable de programmer en fonction de l'interface plutôt que d'une implémentation, et c'est souvent une nécessité lorsqu'on utilise des services Web.
Cela dit, je me demandais pourquoi ce qui suit est illégal avec une déclaration d'interface explicite et légal avec une déclaration implicite :
interface IConnection
{
string ConnectionString { get; }
}
class Connection1 : IConnection
{
// private set is illegal, won't compile
string IConnection.ConnectionString { get; private set; }
}
class Connection2 : IConnection
{
// private set is legal now, it is not part of the interface
string ConnectionString { get; private set; }
}
Je sais comment résoudre ce problème, car il est légal d'avoir à la fois une interface explicite et implicite, et je peux rendre l'implémentation de l'interface implicite complètement privée.
Pourtant, je m'interroge sur le raisonnement qui sous-tend cette décision. Car techniquement, la méthode privée compilée en interne set_IConnection_ConnectionString
n'a pas besoin de faire partie de l'interface, n'est-ce pas ? Il pourrait simplement être considéré comme un setter auxiliaire, ne faisant pas partie de l'interface, comme c'est le cas dans la situation d'implémentation implicite.
Mise à jour : en bonus, l'erreur de compilation apparemment confuse, et à mon avis pas tout à fait correcte, que vous recevez est la suivante :
Le modificateur d'accessibilité de l'accesseur doit être plus restrictif que la propriété Connection1.ConnectionString
Excusez-moi, plus restrictif que private
comment... quoi ?