0
votes

Pourquoi le compilateur est-il conflictuel avec un espace de noms dans l'héritage?

Dans le code suivant

namespace Too
{
    public class Foo
    {

    }
}

namespace Foo
{

    public class Boo : Foo
    {

    }
}


5 commentaires

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 , foo 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


@ 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.


3 Réponses :


0
votes

Parce que foo est dans un espace de noms différent. Lors de l'hérité de FOO

namespace Foo 
{

    class Boo: Foo {


3 commentaires

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 FOO 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).



0
votes

Le compilateur ne peut pas trouver Classe FOO dans l'espace de noms où vous essayez d'hériter d'une nouvelle classe. Vous doit pleinement qualifié le nom, ce n'est pas quelque chose que vous ne pouvez pas sauter ou ne pas faire, sauf si: xxx

sans en utilisant ou complètement Le compilateur de nom qualifié ne cherche même pas dans espace de noms aussi . Essayez d'utiliser n'importe quel type E.G. Liste sans le spécifier complètement ou sans à l'aide de system.collections.generic dans les méthodes, même problème, vous obtiendrez une erreur

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?)


comme pour une erreur:

CS0118 'FOO' est un espace de noms mais est utilisé comme un type

Vous obtenez ceci car le compilateur trouvé dans la portée (si je peux le dire) foo , qui se trouve être un espace de noms et que vous ne devez pas utiliser comme type de base. < / p>


@ Renà © Vogt a formulé la question meilleure:

Pourquoi le compilateur n'est-il pas mis en œuvre de manière à fonctionner

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.

pense à ce cas: xxx

même si le compilateur regarde Espace de noms TOO Vous aurez un conflit de toute façon.


1 commentaires

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à.



4
votes

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 à l'aide de directives .

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 . . 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.

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.


0 commentaires