Si consideri il seguente frammento di codice breve.Puoi spiegare questo caso limite riguardante la parola chiave C# 'using' con dichiarazioni e membri dello spazio dei nomi?
namespace B
{
public class Foo
{
public string Text
{
get { return GetType().FullName; }
}
}
}
namespace A.B
{
public class Foo
{
public string Text
{
get { return GetType().FullName; }
}
}
}
acquisire familiarità con esempio # 1 prima.
using B;
namespace A.C
{
public static class Program
{
public static void Main()
{
Console.WriteLine(new Foo().Text);
}
}
}
Ora consideriamo esempio # 2.
namespace A.C
{
using B; // Notice the placement here.
public static class Program
{
public static void Main()
{
Console.WriteLine(new Foo().Text);
}
}
}
Non c'è nulla di terribilmente di strano esempio # 1. Tuttavia, le cose si fanno interessanti con l'esempio # 2. È fondamentale prestare molta attenzione a tutti gli identificatori utilizzati negli esempi. Come esercizio divertente prova a indovinare cosa succede senza collegarlo al compilatore. Non ti svelerò la risposta qui perché 1) è abbastanza facile provare te stesso e 2) Non voglio rovinare il divertimento.
Sarà il programma:
- non compilare
- visualizzazione B.Foo
- visualizzazione ABFoo
La domanda ... Dove nelle specifiche C# è questo comportamento descritto ?
Ho dato un'occhiata alla sezione 3.7 nella specifica C# 4.0 e in particolare al punto 2, ma non penso che questo spieghi il comportamento. Semmai mi sembra quasi che il compilatore si stia comportando in modo contraddittorio rispetto alle specifiche.
Dovresti pubblicare questa domanda all'autore di questo blog: http://blogs.msdn.com/b/ericlippert/ Avrà assolutamente una risposta per te. – David
Ho familiarità con il suo blog. Inserisce spesso su SO così da poter fare una pugnalata proprio qui. –
Sì, sono in attesa della risposta di Eric me stesso :) –