2012-06-05 2 views
5

Il nostro team è migrato di recente da Visual Studio 2008/.NET3.5 a Visual Studio 2010/.NET4.0. Ora, VS2010 mi dà uno strano messaggio di errore. E 'riproducibile con il seguente programma:Il tipo 'X' non esiste nel 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(); 
     } 
    } 
} 

Questo ha funzionato bene in VS2008, ma in VS2010 ottengo il seguente messaggio di errore:

Il nome del tipo 'Main' non esiste nel tipo' SomeLib.Some '

È interessante notare che se si preme "Build Solution", il programma si integra perfettamente e posso anche eseguirlo senza problemi. È solo Visual Studio che sembra avere un problema con questo codice.

Sfortunatamente, sto lavorando a un'applicazione legacy di grandi dimensioni e non posso (facilmente) modificare i nomi di questi spazi dei nomi.

Mi piacerebbe sapere come posso risolvere questo errore, e sono anche curioso di sapere cosa lo causa.

+2

provare 'usando globale :: Some.Main;' –

+1

E 'divertente. Quel codice esatto, compila su Mono (ultimo). Ma su Visual Studio 2010, non è –

+1

@MichaelBuen E 'ancora peggio, perché su Visual Studio 2008, anche compila. – jqno

risposta

9

È sufficiente fare l'editor confuso. Some è sia un namespace che un nome di interfaccia, evidentemente non controlla/analizza using s nell'ordine in cui sono dichiarati.

Se si vuole mettere in chiaro ti riferisci allo spazio dei nomi e non il nome del tipo è sufficiente aggiungere global:: alla dichiarazione using (a partire dalla radice namespace), in questo modo:

using global::Some.Main; 

UPDATE
Ottimo post qui su SO collegato da @alex in un commento: Should 'using' statements be inside or outside the namespace?

1

Prova questa:

using Some.Main; 
using SomeLib; 

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

Funziona, però. – jqno

+2

Attenzione, spostare l'uso di 's around potrebbe portare alla rottura del codice e dovrebbe * not * essere fatto alla cieca! Vedi http: // StackOverflow.it/questions/125319/should-usings-be-inside-or-outside-the-namespace – Alex

+0

@alex: tuttavia utilizzo sempre fuori dallo spazio dei nomi e non sento mai problemi. – abatishchev

4

Penso IntelliSense è confuso dalla denominazione e non "capire" chi è chi.

screenshot allegato dimostra quello che sta succedendo: IntelliSense "pensa" Some.Main si riferisce alla interfaccia denominata Some, probabilmente perché non c'è uno spazio dei nomi chiamato Some ovunque.

Fortunatamente, il compilatore non è ingannato e il codice sembra funzionare bene, come hai detto tu.

IntelliSense being fooled

+0

E dopo aver creato una build, anche IntelliSense si arresta. –

+0

@HenkHolterman Fino a quando non apporti una modifica; poi torna :) – jqno

+0

@HenkHolterman E questo è più divertente, ho provato a costruirlo, compila. Eppure ha un errore quando si apportano modifiche al codice. Il team IDE di Visual Studio e il compilatore C# costituiscono un team separato? –