2008-11-04 6 views
4

Comment est-il possible que .NET trouve le mauvais 'MyType' dans ce scénario?Collisions d'espace de noms

J'ai un type A.B.C.D.MyType dans un projet sur lequel je travaille, et je référence une DLL qui a un type A.B.MyType? Je n'ai aucun 'using A.B;' des déclarations n'importe où dans mon code, et j'ai 'using A.B.C.D;'. Lorsque je compile, le compilateur pense que toute référence à 'MyType' signifie 'A.B.MyType'. Je sais que je pourrais simplement renommer la classe ou utiliser un alias, mais je me demande comment c'est possible.

Des idées?

Merci!

Répondre

7

Travaillez-vous dans un espace de noms qui se trouve sous l'espace de noms A.B? (Par exemple ABX) si tel est le C# résolutions d'espace de noms (ECMA-334 C# Language Specification : 10.8 10.8 Namespace and type names) dit:

... pour chaque espace de noms N, à partir avec l'espace de noms dans lequel le espace de noms ou typename se produit, continue à chaque enfermant l'espace de noms (le cas échéant), et se terminant par l'espace de noms global, les étapes suivantes sont évaluées jusqu'à ce qu'une entité est située ...

puis suivis par:

Si K est égal à zéro et l'espace de noms déclaration contient un -extern aliasdirective ou à l'aide-aliasdirective qui associe le nom I avec un espace de noms importé ou le type, l'espace de noms ou type- nom fait référence à cet espace de noms ou tapez

cela signifie que la résolution de nom commence à l'espace de noms en cours et recherche tous les espaces de noms jusqu'à la racine, et seulement après cette recherche hiérarchique se termine, puis les espaces de noms importés avec la clause using sont se arqué.

Les impressions exemple suivant « Ns1.Foo »

using Ns1.Foo.Foo2; 

namespace Ns1.Foo 
{ 
    class Foo 
    { 
     public void Print() 
     { 
      System.Console.WriteLine("Ns1.Foo"); 
     } 
    } 
} 

namespace Ns1.Foo.Foo2 
{ 
    class Foo 
    { 
     public void Print() 
     { 
      System.Console.WriteLine("Ns1.Foo.Foo2"); 
     } 
    } 
} 

namespace Ns1.Foo.Bar 
{ 
    class Bar 
    { 
     public void Print() 
     { 
      new Foo().Print(); 
     } 

     static void Main() 
     { 
      new Bar().Print(); 
     } 
    } 
} 

Edit: Ajout d'une clause à l'aide à l'intérieur un espace de noms, va faire en sorte que l'espace de noms est recherché avant la recherche hiérarchique de l'espace de noms actuel est fait est terminé.Modifier l'exemple à:

namespace Ns1.Foo.Bar 
{ 
    using Ns1.Foo.Foo2; 
    class Bar 
    { 
     public void Print() 
     { 
      new Foo().Print(); 
     } 

     static void Main() 
     { 
      new Bar().Print(); 
     } 
    } 
} 

et Ns1.Foo.Foo2 seront imprimés.

Édition: modifié l'exemple

0

Juste une supposition: dans les propriétés de votre projet, l'espace de noms par défaut est-il défini sur A.B?

3

Votre code est-il dans l'espace de noms A.B ou A.B.C? Si c'est le cas, c'est probablement le problème. Utilisez une directive en utilisant comme ceci:

using TheTypeIWant = A.B.C.D.MyType; 

alors juste se référer à TheTypeIWant dans votre code.

EDIT: J'ai juste essayé l'option "using MyType=A.B.C.D.MyType", mais que ne fonctionne pas. Ce qui précède est bien cependant.