Dans le code suivant
namespace Too { public class Foo { } } namespace Foo { public class Boo : Foo { } }
3 Réponses :
Parce que foo est dans un espace de noms différent. Lors de l'hérité de FOO
namespace Foo { class Boo: Foo {
Je pense que OP sait cela. La question est la suivante: pourquoi le compilateur n'est-il pas mis en œuvre de manière à fonctionner cela. Je veux dire, il est évident que vous ne voulez pas hériter d'un espace de noms, mais d'une classe (ou d'une interface), et je ne vois pas ce qui pourrait éventuellement se tromper si le compilateur ferait cette décision. Mais en fait, seuls les développeurs compilateurs peuvent répondre à cette question.
Oui, mais pourquoi le compilateur tenterait-il d'utiliser l'espace de noms code> FOO code> où un espace de noms ne serait jamais valide?
Ce n'est pas la magie après tout. En outre, il assure une meilleure lisibilité du code (ce point est suffisant pour valider l'erreur à mon avis).
Le compilateur ne peut pas trouver sans Le nom de type ou d'espace de noms 'FOO' n'a pas pu être trouvé (manquez-vous une directive ou une référence d'assemblage?) p>
blockQuote> comme pour une erreur: p> CS0118 'FOO' est un espace de noms mais est utilisé comme un type p>
blockQuote> Vous obtenez ceci car le compilateur trouvé dans la portée (si je peux le dire) @ Renà © Vogt a formulé la question meilleure: p> Pourquoi le compilateur n'est-il pas mis en œuvre de manière à fonctionner p>
BlockQuote> Pour une réponse, nous devons demander aux développeurs. Mais dans ma compréhension, ce ne serait pas un gain énorme et vaut la peine d'être effort pour y parvenir. Personnellement, je ne vois pas de problème avec le compilateur à dire spécifiquement où regarder. P> pense à ce cas: p> même si le compilateur regarde Classe FOO code> dans l'espace de noms code> code> où vous essayez d'hériter d'une nouvelle classe. Vous doit strong> pleinement qualifié le nom, ce n'est pas quelque chose que vous ne pouvez pas sauter ou ne pas faire, sauf si:
en utilisant code> ou complètement Le compilateur de nom qualifié ne cherche même pas fort> dans
espace de noms aussi code>. Essayez d'utiliser n'importe quel type E.G.
Liste
à l'aide de system.collections.generic code> dans les méthodes, même problème, vous obtiendrez une erreur p>
foo code>, qui se trouve être un espace de noms et que vous ne devez pas utiliser comme type de base. < / p>
Espace de noms TOO CODE> Vous aurez un conflit de toute façon. P> p>
Je suppose que OP ne demande pas à la raison pour laquelle le compilateur n'accepte pas FOO sans la qualification de nom complet, mais pourquoi il ne devine pas que le code dans ce point particulier fait nécessairement référence à une classe, simplement parce qu'un espace de noms n'est pas autorisé. là.
Le compilateur ne se soucie pas de beaucoup si votre référence est une classe ou un espace de noms lorsqu'il résout d'abord les noms. Si un nom n'est pas pleinement qualifié, il essaiera toujours de le trouver dans l'espace de noms local, y compris le nom de l'espace de noms lui-même. S'il ne peut pas le trouver dans l'espace de noms local, il essaiera du La raison pour laquelle il le résout, c'est que vous pouvez après tout Créer une hiérarchie d'espace de noms et toutes les classes et espaces de noms sont séparés par Avec les espaces de sous-noms et les sous-classes Il serait difficile pour le compilateur d'identifier une correspondance s'il essaie simplement d'en forme une et peut trouver plusieurs références si elle correspond à des espaces de noms aléatoires dans le même assemblage. Ainsi, c'est toujours un espace de noms local d'abord, puis déplace la hiérarchie à travers d'autres assemblées. Si ce n'est pas clair parce que deux espaces de sous-noms ou des classes avec le même nom existent dans différents espaces de noms qui sont à la fois référencés, vous devez être encore plus clair. P> à l'aide de directives CODE>. P>
. code>. Ainsi, lors de la résolution des noms, le compilateur ne se soucie pas de beaucoup de choses sur le type, mais uniquement sur le chemin de la hiérarchie. Cela se souciera du type si dès qu'il a trouvé un match. Dans ce cas, il s'agit d'un espace de noms quand il s'attend à une classe et échoue donc. P>
Je suppose que c'est stupide stupide .. mais il semble étrange que cela ne sache pas à utiliser la bonne chose.
Parce que dans la portée de l'espace de noms
foo code>,
foo code> fait référence à l'espace de noms. C'est la façon dont le compilateur est construit. Vous devrez faire référence au nom de type complet ici,
BOO de la classe publique: TOO.FOO CODE>
@ Lassevågsætherkarlsen Oui, mais pourquoi le compilateur tente d'utiliser un espace de noms dans un endroit où un espace de noms ne serait jamais valide? Une classe ne peut pas hériter d'un espace de noms ... Ma question n'est pas de savoir comment faire fonctionner ce code mais pourquoi cela fonctionne de cette façon?
Je ne vois pas de problème à spécifier le nom pleinement de la qualification. Est-ce un problème ou que allez-vous faire avec la réponse?
@Mathieuviales Le compilateur n'appelle pas cet appel à l'une des deux raisons: soit cela causerait des problèmes qui ne sont pas évidents pour vous, sinon il y a toujours été des caractéristiques plus importantes de l'équipe de travailler.