8 votes

Pourquoi le compilateur C# fait-il la différence entre ces deux cas ?

Lorsque vous avez une propriété qui est comme.. :

using Algebra;

public Algebra.Vector3 Direction
{
    get { return this.direction; }
}

puis le compiler et le modifier par la suite :

using Algebra;

public Vector3 Direction
{
    get { return this.direction; }
}

il semble que le code compilé soit différent entre les deux assemblages, ce que je pourrais voir en utilisant le Reflector.

Pourquoi le compilateur fait-il la différence entre les deux codes ? N'est-il pas seulement nécessaire de voir s'il y a un type ambigu au moment de la compilation et, s'il n'y en a pas, de faire en sorte que le code compilé soit le même pour les deux ? Je suppose que le code compilé utilise des noms pleinement qualifiés pour chaque membre à tout moment.

7voto

Jon Skeet Points 692016

Je n'arrive pas à reproduire ce phénomène. Exemple de code :

namespace Algebra
{
    public class Vector3 {}
}

namespace Test
{
    using Algebra;

    public class Program
    {
        private Vector3 direction = null;

        public Vector3 Direction1
        {
            get { return direction; }
        }

        public Algebra.Vector3 Direction2
        {
            get { return direction; }
        }
    }
}

L'IL généré pour les deux propriétés est exactement le même, et elles ont le même aspect dans le réflecteur.

Je pense que vous avez en fait a une autre classe appelée Vector3 dans l'espace de noms "global" (ou dans un autre espace de noms pour lequel vous disposez d'une directive d'utilisation).

Essayez de survoler les deux noms de type dans Visual Studio et voyez ce qu'ils affichent.

2voto

Timwi Points 30896

Voici un exemple qui serait générer les résultats que vous observez. J'espère que cela répond à votre question. En supposant que vous ayez

  • une bibliothèque séparée contenant le type Vector3 dans un espace de noms Algebra ;

  • les fichiers suivants dans votre projet :

Fichier ①

namespace NotAlgebra
{
    public class Vector3
    {
        // ...
    }
}

Fichier ②

using Algebra;

namespace NotAlgebra
{
    public class XYZ
    {
        // Refers to NotAlgebra.Vector3 (defined in File 1 above)
        Vector3 MyProperty1 { get; }

        // Refers to Algebra.Vector3 (defined in the external library)
        Algebra.Vector3 MyProperty2 { get; }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X