2011-02-04 13 views
8

Dato il seguente frammento di codice:Perché i tipi a cui si fa riferimento al di fuori di uno spazio dei nomi devono essere pienamente qualificati?

using System; 

using Foo = System.Int32; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     } 
    } 
} 

Se rimuovo il "Sistema". da davanti a Int32 nella mia dichiarazione per l'alias di tipo "Foo", ottengo un errore del compilatore. Nonostante il fatto che sto usando lo spazio dei nomi di sistema nella parte superiore del file, il compilatore non riesce a trovare un tipo "Int32" non qualificato.

Perché è quello?

+1

Non è "tipi" al di fuori di uno spazio dei nomi. È solo sull'utilizzo di dichiarazioni alias. 'class Program {static void Main (String [] args) {Int32 x = 0; }} 'al di fuori di un blocco del namespace funziona bene. –

risposta

10

Questo perché la specifica C# dice che deve essere. Più in particolare, la sezione 9.4.1 nella specifica C# dice:

L'ordine in cui sono scritti usando-alias direttive non ha alcun significato, e la risoluzione del-o il tipo-nome-dominio citato da un using- la direttiva alias non è influenzata dalla direttiva using alias stessa o da altre direttive using nell'unità di compilazione o nello spazio dei nomi immediatamente contenente. In altre parole, lo spazio nome o nome-tipo di una direttiva using alias viene risolto come se l'unità di compilazione o il corpo dello spazio dei nomi immediatamente contenente non avesse direttive di utilizzo. Una direttiva using alias può tuttavia essere influenzata dalle direttive alias extern nell'unità di compilazione o nello spazio dei nomi immediatamente contenente.

Poiché l'ordine non è rilevante, lo using System; non ha alcun effetto sulla direttiva using alias. La sezione specifica che conta è: "lo spazio nome o nome-tipo di una direttiva using alias viene risolto come se l'unità di compilazione o il corpo dello spazio dei nomi contenenti immediatamente non avesse direttive using".

+0

Questo spiega anche perché "usare Bar = System.Collections.Generic.List ;" anche sulla linea successiva non funziona. Grazie! –

+0

@Matt: prego. In caso di dubbio, cerca nelle specifiche;) –

4

Il spec (9.3) dice:

L'ambito di una using-directive estende su Lo spazio dei nomi-utente-dichiarazioni del suo immediatamente contenente il corpo unità di compilazione o di spazio dei nomi. Lo scopo di una direttiva using non include specificamente le sue direttive using peer. Pertanto, le direttive peer using non si influenzano a vicenda e l'ordine in cui sono scritte è insignificante.

Sposta l'ultimo using all'interno del blocco dello spazio dei nomi e funzionerà.

using System; 

namespace ConsoleApplication3 
{ 
    using Foo = Int32; 
+0

So che funziona all'interno del blocco namespace - ero solo curioso di sapere perché. È nelle specifiche da qualche parte? –

+1

L'aggiunta di una citazione dalla specifica è benvenuta, @Slaks, ma penso che dovrò dare la risposta a Reed per aver postato prima quel testo. +1 però! –

6

Perché le istruzioni di utilizzo non vengono elaborate in un ordine particolare. Il compilatore non sa di elaborare la prima riga prima del secondo.

Problemi correlati