2010-03-14 7 views
8

Klassenname: MyAssembly.MyClass+MyOtherClassHaben Sie ein "+" im Klassennamen?

Das Problem ist offensichtlich die + als Separator, statt traditionnal Punkt, seine Funktion und offizielle Dokumentation zu finden, um zu sehen, ob andere Separatoren bestehen. Diese

+0

Warum wollen Sie das wissen? Was versuchst du mit diesem Wissen zu erreichen? –

Antwort

13

das ist nur die Art und Weise, dass eine verschachtelte Art dargestellt wird, gesehen werden. So zum Beispiel:

namespace Foo 
{ 
    class Outer 
    { 
     class Nested {} 
    } 
} 

einen Typen mit einem vollständigen Namen Foo.Outer+Nested im kompilierten Code erstellen. (So ​​ist das, was typeof(Outer.Nested).FullName zurückkehren würde, zum Beispiel.)

Es ist mir nicht klar, ob dies Verhalten angegeben, oder das, was nur die Microsoft C# Compiler zu verwenden, wählen; Es ist ein "unaussprechlicher" Name, weil Sie eine Klasse mit einem + darin in normalen C# nicht explizit deklarieren können, so dass der Compiler weiß, dass es mit nichts anderem kollidieren wird. Abschnitt 10.3.8 der C# 3-Spezifikation diktiert nicht den kompilierten Namen, soweit ich sehen kann.

EDIT: Ich habe gerade gesehen, dass Type.AssemblyQualifiedName gibt an, dass „+“ verwendet wird, einen verschachtelten Typnamen vorangehen ... aber es ist immer noch nicht klar, ob diese tatsächlich erforderlich oder nur herkömmliches sind.

+2

Eine andere Möglichkeit, wie sich dieses Implementierungsdetail manifestiert, sind verschachtelte generische Typen. Wenn Sie Klasse Outer mit verschachtelten Klasse Inner werden Sie sehen, dass, was Sie tatsächlich in Metadaten erhalten, sind zwei Typen, Outer <'1> und Outer + Inner <'2>. Verschachtelte Typen sind aus der CLR-Perspektive wirklich nur ein bequemer Fake, der von der Sprache erzählt wird. Die Verschachtelung manifestiert sich "real" nur so gut, dass der innere Typ auf die privaten Mitglieder des äußeren Typs zugreifen kann. (Namespaces ist in ähnlicher Weise eine Fiktion.) –

+0

Wenn der Name der geschachtelten Klasse einfach durch Microsofts C# Compiler gewählt wurde, wie würde die Interoperabilität mit anderen Compilern möglich sein? Bedeutet es, dass man verschachtelte Klassen nicht verwenden kann, wenn z.B. Verwenden Sie den Mono-Compiler? –

+0

divo: Ich würde annehmen, dass Monos C# Compiler dem gleichen Schema folgt wie Microsoft. Ebenso irgendwo anders, wo etwas in der C# -Spezifikation nicht angegeben ist. –

10

ist das, was der Compiler in den Metadaten verwendet eine verschachtelte Klasse darzustellen.

heißt

class A { class B {} } 

würde als

class A+B 

in den Metadaten

+1

danke. Das ist das einzige Zeichen, das wir auf diese Weise finden könnten? – Graveen

+0

Ich habe gerade die .NET (1.1) -Bibliothek in ILDASM angeschaut und die darin enthaltenen verschachtelten Typen haben '/' als Trennzeichen angezeigt. –

+0

Also ILDASM lügt. –