Betrachten Sie das folgende kurze Code-Snippet.Können Sie diesen Randfall mit dem Schlüsselwort C# 'using' bei Namespace-Deklarationen und -Mitgliedern erklären?
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; }
}
}
}
Setzen Sie sich mit Beispiel # 1 zuerst vertraut.
using B;
namespace A.C
{
public static class Program
{
public static void Main()
{
Console.WriteLine(new Foo().Text);
}
}
}
Betrachten wir nun Beispiel # 2.
In Beispiel 1 ist nichts besonders Seltsames. Bei Beispiel 2 wird es jedoch interessant. Achten Sie unbedingt auf alle in den Beispielen verwendeten Bezeichner. Als eine lustige Übung versuchen Sie zu erraten, was passiert, ohne dies in den Compiler zu stecken. Ich werde die Antwort hier nicht verraten, weil 1) es einfach genug ist, es selbst zu versuchen und 2) Ich möchte den Spaß nicht ruinieren.
Wird das Programm:
- kompilieren nicht
- Anzeige B.Foo
- Anzeige ABFoo
Die Frage ... Wo in der C# Spezifikation ist dieses Verhalten beschrieben ?
Ich habe einen Blick auf Abschnitt 3.7 in der C# 4.0-Spezifikation und vor allem Kugel # 2, aber ich glaube nicht, dass das das Verhalten erklärt. Wenn überhaupt, dann kann ich fast glauben, dass der Compiler sich der Spezifikation widerspricht.
Sie sollten diese Frage an den Autor dieses Blogs senden: http://blogs.msdn.com/b/ericlippert/ Er wird absolut eine Antwort für Sie haben. – David
Ich kenne seinen Blog. Er postet oft auf SO, damit er einen Stich hier machen kann. –
Ja, ich erwarte Erics Antwort selbst :) –