Les bonnes questions. Permettez-moi de re-état.
Pourquoi est-il légal pour masquer une méthode avec une autre méthode?
Permettez-moi de répondre à cette question avec un exemple. Vous disposez d'une interface de CLR v1:
interface IEnumerable
{
IEnumerator GetEnumerator();
}
Super. Maintenant, dans le CLR v2 vous avez des génériques et vous pensez que "l'homme, si seulement nous avions eu des génériques en v1, j'aurais fait une interface générique. Mais je n'ai pas. Je dois faire quelque chose de compatible avec elle maintenant qui est générique en sorte que je reçois les avantages des médicaments génériques sans perdre la compatibilité avec le code qui attend IEnumerable."
interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> .... uh oh
Qu'allez-vous appeler la méthode GetEnumerator de IEnumerable<T>
? Rappelez-vous, vous voulez de lui cacher GetEnumerator sur la non-générique de base de l'interface. Vous jamais voulez que chose d'être appelé, sauf si vous avez explicitement dans une arrière-compat situation.
Qui à lui seul justifie la méthode de masquage. Pour plus d'idées sur la justification de la méthode de masquage voir mon article sur le sujet.
Pourquoi se cacher sans aucun "nouveau" provoquer un avertissement?
Parce que nous voulons porter à votre attention que vous cachez quelque chose et peut-être le faire accidentellement. Rappelez-vous, vous pourriez être en train de cacher quelque chose accidentellement à cause d'une modification de la classe de base fait par quelqu'un d'autre, plutôt que par vous de l'édition de votre classe dérivée.
Pourquoi se cache sans "nouvelle" un avertissement plutôt qu'une erreur?
Même raison. Vous pourriez être en train de cacher quelque chose accidentellement parce que vous avez juste pris une nouvelle version d'une classe de base. Cela arrive tout le temps. FooCorp fait une classe de base B. BarCorp fait une classe dérivée d'une méthode de Barre, parce que leurs clients comme cette méthode. FooCorp le voit et dit hey, c'est une bonne idée, nous pouvons mettre cette fonctionnalité sur la classe de base. Ils le font et l'expédition d'une nouvelle version de Foo.DLL et quand BarCorp ramasse la nouvelle version, ce serait bien si ils ont dit que leur méthode de cache maintenant la méthode de classe de base.
Nous voulons que la situation à un avertissement et non une erreur parce que faire une erreur signifie que c'est une autre forme de l'fragile de la classe de base problème. C# a été soigneusement conçu de sorte que lorsque quelqu'un effectue un changement d'une classe de base, les effets sur le code qui utilise un dérivé de la classe sont réduits au minimum.
Pourquoi se cache et ne prévalent pas par défaut?
Parce que virtuel remplacement est dangereux. Virtuel permet de remplacer les classes dérivées à modifier le comportement de code qui a été compilé pour utiliser les classes de base. Faire quelque chose de dangereux, comme faire un remplacement doit être quelque chose que vous faites consciemment et délibérément, et non par accident.