Rozważ następujący krótki fragment kodu.Czy możesz wyjaśnić ten przypadek krawędzi obejmujący słowo kluczowe C# 'using' z deklaracjami i członkami przestrzeni nazw?
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; }
}
}
}
Zapoznaj się z Przykład # 1 pierwszy.
using B;
namespace A.C
{
public static class Program
{
public static void Main()
{
Console.WriteLine(new Foo().Text);
}
}
}
Rozważmy teraz Przykład # 2.
namespace A.C
{
using B; // Notice the placement here.
public static class Program
{
public static void Main()
{
Console.WriteLine(new Foo().Text);
}
}
}
Nie ma nic strasznie dziwnego w przykładzie nr 1. Jednak rzeczy stają się interesujące z przykładu nr 2. Koniecznie zwracaj szczególną uwagę na wszystkie identyfikatory użyte w przykładach. Jako zabawne ćwiczenie spróbuj odgadnąć, co się dzieje, bez podłączania tego do kompilatora. Nie ujawnię tutaj odpowiedzi, ponieważ 1) łatwo jest spróbować siebie i 2) Nie chcę zepsuć zabawy.
Czy program:
- nie skompilować
- wyświetlacz B.Foo
- wyświetlacz ABFoo
pytanie ... Gdzie w specyfikacji C# jest to zachowanie opisane ?
Zerknąłem na sekcję 3.7 w specyfikacji C# 4.0, a zwłaszcza na punkt # 2, ale nie sądzę, że wyjaśnia to zachowanie. Jeśli już, to prawie sprawia, że myślę, że kompilator zachowuje się sprzecznie ze specyfikacją.
Powinieneś opublikować to pytanie autorowi tego bloga: http://blogs.msdn.com/b/ericlippert/ On będzie absolutnie mieć odpowiedź dla ciebie. – David
Znam jego bloga. Często wysyła posty na SO, więc może zabrać tutaj. –
Tak, sam oczekuję odpowiedzi Erica :) –