6
votes

Pourquoi ce code a-t-il de nouveau dans l'indexeur de collections?

Dupliqué possible:
"Nouveau" mot-clé dans la déclaration de propriété

Pardonnez-moi si c'est c # 101, mais j'essaie de comprendre le code ci-dessous: xxx

Pourquoi l'indexeur a-t-il neuf devant celui-ci? À propos, lapin est une classe définie dans un autre fichier. Merci!


1 commentaires

J'utiliserais une coulée de style C au lieu de la mouffette en toute sécurité. Maintenant, jetez-le et utilisez une liste .


4 Réponses :


6
votes

Essayez de supprimer de nouveau du code et vous devriez obtenir un avertissement:

rabbitcollection.Cette [int] ' Membre hérité de cache 'System.Collections.ArrayList.Ce [int]' '. pour faire le membre actuel Remplacez cette implémentation, ajoutez le mot-clé de remplacement. Sinon ajouter le nouveau mot-clé.

Vous voudrez peut-être voir Nouveau modificateur C #

Le nouveau mot clé cache explicitement un membre hérité d'une classe de base . Lorsque vous masquez un membre hérité, la version dérivée du membre remplace la version de la classe de base. Bien que vous puissiez masquer des membres sans L'utilisation du nouveau modificateur, le résultat est un avertissement. Si vous utilisez de nouveaux Pour masquer explicitement un membre, il supprime cet avertissement et ces documents le fait que la version dérivée est destinée à remplacer.


1 commentaires

Wow, réponse rapide de vous tous les gars! C'est une excellente information. Merci!



4
votes

Parce que la classe de base ( ArrayList ) a également un indexeur. Le nouveau dit "Je remplace délibérément le membre de la classe de base avec l'une des miennes."

Cela fonctionne également sans le nouveau , mais le nouveau indique au compilateur que vous savez ce que vous faites.

Bien sûr, dans le code écrit à tout moment au cours des sept ou huit dernières années, vous devez utiliser Liste au lieu de ArrayList , et puis vous ne le faites pas besoin de faire un descendant avec son propre indexeur de dactylographié fort.


1 commentaires

Merci! c'est bien




1
votes

Habituellement, si un baseType entend une méthode à remplacer, il serait marqué comme virtuel. Dans ce cas, le sous-type marque simplement la méthode avec le remplacement.

Si le BaseType ne le fait pas et que le sous-type définit une méthode identique, il y a une ambiguïté. Le C # Compiler vous demande de confirmer que vous le souhaitez en marquant la méthode du sous-type avec un dant nouveau - En effet, je suis conscient et je souhaite masquer la méthode offerte par le type de base '


0 commentaires