2012-06-05 11 views
5

Nuestro equipo ha migrado recientemente de Visual Studio 2008/.NET3.5 a Visual Studio 2010/.NET4.0. Ahora, VS2010 me da un mensaje de error extraño. Es reproducible, con el siguiente programa:El tipo 'X' no existe en el tipo 'Y.Z'

using System; 

namespace Some.Main 
{ 
} 

namespace SomeLib 
{ 
    interface Some 
    { 
    } 
} 

namespace ConsoleApplication1 
{ 
    using Some.Main; 
    using SomeLib; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Write("Press enter to continue"); 
      Console.ReadLine(); 
     } 
    } 
} 

Esto funcionó muy bien en VS2008, pero en VS2010 me sale el siguiente mensaje de error:

El nombre del tipo 'principal' no existe en el tipo ' SomeLib.Some '

Curiosamente, si presiono' Build Solution ', el programa se compila muy bien, y puedo incluso ejecutarlo sin ningún problema. Simplemente es Visual Studio que parece tener un problema con este código.

Desafortunadamente, estoy trabajando en una aplicación heredada de gran tamaño y no puedo (fácilmente) cambiar los nombres de estos espacios de nombres.

Me gustaría saber cómo puedo solucionar este error, y también tengo curiosidad por saber cuál es la causa.

+2

intento 'usando mundial :: Some.Main;' –

+1

Es curioso. Ese código exacto, se compila en Mono (más reciente). Pero en Visual Studio 2010, no es –

+1

@MichaelBuen. Es aún peor, porque en Visual Studio 2008 también se compila. – jqno

Respuesta

9

simplemente hacer el editor confundidos. Some es un espacio de nombre y un nombre de interfaz, evidentemente no verifica/analiza using s en el orden en que se declaran.

Si desea dejar en claro que usted se refiere al espacio de nombres y no el nombre del tipo sólo tiene que añadir global:: a la declaración using (a partir de la raíz espacio de nombres), así:

using global::Some.Main; 

ACTUALIZACIÓN
Muy buen post aquí en SO vinculado por @alex en un comentario: Should 'using' statements be inside or outside the namespace?

1

Prueba esto:

using Some.Main; 
using SomeLib; 

namespace ConsoleApplication1 
{ 
    // instead of placing usings here. 
} 
+1

Sin embargo, funciona. – jqno

+2

¡Cuidado, mover 'usar' puede llevar a la descifración del código y no * se debe * hacer a ciegas! Ver http: // stackoverflow.com/questions/125319/should-usings-be-inside-or-outside-the-namespace – Alex

+0

@alex: sin embargo, siempre uso fuera del espacio de nombres y nunca escucho ningún problema. – abatishchev

4

creo IntelliSense es confundido por la denominación y no "comprender" quién es quién.

captura de pantalla adjunta demuestra lo que está pasando: IntelliSense "piensa" Some.Main se refiere a la interfaz llamada Some, probablemente debido a que no hay un espacio de nombres llamado Some en cualquier lugar.

Afortunadamente, el compilador no se deja engañar así y el código parece funcionar bien, como usted dijo.

IntelliSense being fooled

+0

Y después de hacer una compilación, IntelliSense deja de quejarse también. –

+0

@HenkHolterman Hasta que realices un cambio; luego vuelve :). – jqno

+0

@HenkHolterman Y eso es más divertido, intenté construirlo, compila. Sin embargo, tiene un error cuando realiza cambios en el código. ¿El equipo IDE de Visual Studio y el equipo compilador de C# son un equipo diferente? –

Cuestiones relacionadas