2015-06-16 11 views
14

Ho una classe come questa:C# con riferimenti Namespace nascosto da Classe Spazio dei nomi

namespace Token1.Token2.Token3 
{ 
    public class Class1 
    { 
    } 
} 

E un'altra classe come questa:

namespace Token2.Token4.Token5 
{ 
    public class Class1 
    { 
    } 
} 

La prima classe è una parte del mio progetto, la seconda classe proviene da una libreria di framework sviluppata da un altro gruppo all'interno della mia organizzazione. Si noti che lo spazio dei nomi della prima classe ha Token2 in secondo luogo e lo spazio dei nomi della seconda classe ha Token2 in primo luogo.

Il problema che sto avendo è che non riesco a fare riferimento alla seconda classe nel primo a causa di quella che sembra una collisione di namespace. Se provo a fare questo in prima classe:

namespace Token1.Token2.Token3 
{ 
    public class Class1 
    { 
     var frameworkClass1 = new Token2.Token4.Token5.Class1(); 
    } 
} 

l'IDE di Visual Studio mette in evidenza Token4 in rosso e dice "Impossibile risolvere il simbolo 'Token4'". Se si passa il mouse sopra Token2, dove sono new'ing su Class1, intellisense mi mostra "namespace Token1.Token2", quindi è chiaramente vedere lo spazio dei nomi della mia classe di progetto e non vedere lo spazio dei nomi della mia classe framework.

Sarebbe molto difficile cambiare lo spazio dei nomi di entrambe le librerie di classi a causa della quantità di codice già presente. C'è un modo per aggirare questo?

+2

La soluzione al tuo problema è ** se fa male quando lo fai, non farlo **. Non * mai * struttura gli spazi dei nomi in cui il primo livello di uno spazio dei nomi è uguale al secondo livello di un altro spazio dei nomi. Non provoca altro che dolore. Seguire le linee guida standard per creare spazi dei nomi che non hanno queste ambiguità. Dici che non puoi cambiarlo ora; Ti garantisco che sarà * più difficile * cambiare in futuro, quindi ora sembra un buon momento. –

risposta

25

Dal Token2 è anche un sub-namespace di Token1 è necessario specificare che si sta cercando il "root" dello spazio dei nomi:

var frameworkClass1 = new global::Token2.Token4.Token5.Class1(); 

Si potrebbe anche alias IT con un using dichiarazione:

using Token5 = global::Token2.Token4.Token5; 

E poi basta fare riferimento l'alias:

var frameworkClass1 = new Token5.Class1(); 
+0

Se ti capita di sapere ** perché ** è considerato utile classificare classi con sotto-namespace, penso che sarebbe una buona estensione di questa risposta. (O c'è già un'altra domanda qui a riguardo?) Java non ha questo problema perché devi sempre usare i percorsi completi lì, sia nell'importazione che nel riferimento alla classe, e non ho mai pensato che si trattasse di una restrizione . – Matthias

+0

Non riesco a rispondere perché (o lo paragono a Java perché non sono uno sviluppatore Java) - i bravi ragazzi che hanno scritto le specifiche del linguaggio C# ([sezione 3.8 - Namespace e nomi di tipo] (https://msdn.microsoft .com/it/us/library/aa691136.aspx)) sentivamo ovviamente che ci fosse qualche vantaggio nella ricerca anche negli spazi dei nomi. –

3

Puoi provare global :: Token2 per lo spazio dei nomi framework

Problemi correlati