Betrachten Sie den folgenden kurzen Codeschnipsel.
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; }
}
}
}
Machen Sie sich mit Beispiel #1 vertraut.
using B;
namespace A.C
{
public static class Program
{
public static void Main()
{
Console.WriteLine(new Foo().Text);
}
}
}
Betrachten Sie nun Beispiel #2.
namespace A.C
{
using B; // Beachten Sie die Platzierung hier.
public static class Program
{
public static void Main()
{
Console.WriteLine(new Foo().Text);
}
}
}
An Beispiel #1 ist nichts besonders auffälliges. Allerdings wird es interessant mit Beispiel #2. Es ist wichtig, dass Sie alle Bezeichner in den Beispielen genau beachten. Als lustige Übung versuchen Sie zu erraten, was passiert, ohne dies in den Compiler einzugeben. Ich werde hier die Antwort nicht verraten, weil 1) es einfach genug ist, es selbst auszuprobieren und 2) ich den Spaß nicht verderben möchte.
Wird das Programm:
- nicht kompilieren
- B.Foo anzeigen
- A.B.Foo anzeigen
Die Frage...Wo im C#-Spezifikation wird dieses Verhalten beschrieben?
Ich habe mir Abschnitt 3.7 in der C# 4.0-Spezifikation angesehen, insbesondere Punkt #2, aber ich glaube nicht, dass dies das Verhalten erklärt. Wenn überhaupt, lässt es mich fast denken, dass der Compiler sich widersprüchlich zur Spezifikation verhält.
0 Stimmen
Sie sollten diese Frage an den Autor dieses Blogs posten: blogs.msdn.com/b/ericlippert Er wird definitiv eine Antwort für Sie haben.
0 Stimmen
Ich kenne seinen Blog. Er postet häufig auf SO, also könnte er hier einen Versuch starten.
0 Stimmen
Ja, auch ich warte auf die Antwort von Eric :)