Warum müssen Typen, die außerhalb eines Namespaces referenziert werden, vollständig qualifiziert sein?

8

Gegeben das folgende Code-Snippet:

%Vor%

Wenn ich das "System" entferne. Vor Int32 in meiner Deklaration für den Alias ​​"Foo" bekomme ich einen Compilerfehler. Trotz der Tatsache, dass ich den System-Namespace am Anfang der Datei verwende, kann der Compiler keinen nicht qualifizierten "Int32" -Typ finden.

Warum ist das so?

    
Matt Hamilton 04.02.2011, 03:31
quelle

3 Antworten

10

Dies liegt daran, dass die C # -Spezifikation besagt, dass es sein muss. Genauer gesagt sagt Abschnitt 9.4.1 in der C # -Spezifikation:

  

Die Reihenfolge, in der using-alias-directives geschrieben werden, hat keine Bedeutung, und die Auflösung des Namespace-oder-type-Namens, auf den sich eine using-alias-Anweisung bezieht, wird durch die using-alias-Direktive selbst oder durch nicht beeinflusst andere using-Direktiven in der sofort enthaltenen Kompilierungseinheit oder dem Namespace-Text. Mit anderen Worten, der Namespace-oder-Typ-Name einer Alias-Benutzungs-Direktive wird aufgelöst, als ob die sofort enthaltene Kompilierungseinheit oder der Namespace-Rumpf keine using-Direktiven hätte. Eine using-alias-Direktive kann jedoch von extern-alias-Anweisungen in der unmittelbar enthaltenen Kompilierungseinheit oder dem Namespace-Textkörper beeinflusst werden.

Da die Reihenfolge keine Rolle spielt, hat using System; keine Auswirkung auf die Alias-Anweisung. Der spezifische Abschnitt, der von Bedeutung ist, lautet: " Der Namespace-oder-Typ-Name einer Alias-Benutzungs-Direktive wird aufgelöst, als ob die sofort enthaltene Kompilierungseinheit oder der Namespace-Rumpf keine using-Direktiven " / p>     

Reed Copsey 04.02.2011, 03:36
quelle
6

Weil die Verwendung von Anweisungen nicht in einer bestimmten Reihenfolge verarbeitet wird. Der Compiler weiß nicht, die erste Zeile vor der Sekunde zu verarbeiten.

    
Chris Shain 04.02.2011 03:35
quelle
4

Die Spezifikation (9.3) lautet:

  

Der Gültigkeitsbereich einer using-Direktive erstreckt sich über die Namespace-Member-Deklarationen seiner sofort enthaltenen Kompilierungseinheit oder des Namespace-Rumpfs. Der Umfang einer using-Direktive beinhaltet ausdrücklich nicht die Peer-Using-Direktiven. Peer-using-Direktiven beeinflussen sich gegenseitig nicht, und die Reihenfolge, in der sie geschrieben werden, ist unbedeutend.

Verschieben Sie Ihre letzte using in den Namespace-Block und es wird funktionieren.

%Vor%     
SLaks 04.02.2011 03:34
quelle

Tags und Links