2013-02-14 7 views

Odpowiedz

15

Zasadniczo: specyfikację języka, ale faktycznie, Type.FullName wykorzystuje bcl definicji, a nie # definicje C - i co ciekawe nie zgadzają?.. np

namespace X { 
    public class Y { 
     public class Z {} 
    } 
} 

C#, Z jest X.Y.Z, do BCL jest X.Y+Z reprezentacja generycznych zmienia też - z powrotem za pomocą BCL-T. liczby i liczby zamiast nawiasów ostrych. I wierzę, BCL używa formatu typów CLI (który ma osobną specyfikację), ale jeśli myślisz o tym: nie jest to wymagane (z wyjątkiem podczas emisji odbicia).

AFAIK, te separatory nie są odsłonięte przez coś podobnego do Path.PathSeparator - ale jest, jak to się mówi, zakodowane na stałe w klasach itp. Type.

+0

Myślę, że notacja 'X.Y + Z' może być widoczna dla typów anonimowych i śladów stosu ...? –

+0

@ThorstenDittmar pod względem C#, typy anonimowe * nigdy nie mają nazwy *. Kompilator generuje nazwy, które są nielegalne w C# - takie rzeczy jak '<> _ 4' (etc). Zobaczysz taką notację tylko dla typów anonimowych, jeśli spojrzysz na ich nazwę BCL, być może za pomocą '.GetType()' - ale to nie jest takie samo, jak patrzenie na zwykły typ, taki jak 'X.Y + Z'. Pod względem śledzenia stosu: tak, użyje wewnętrznej reprezentacji typów: ponieważ znowu nie jest to kompilator działający w tym punkcie, więc terminologia C# nie ma zastosowania. Podobnie, 'int' zwykle będzie' System.Int32' itp. –

5

Separator między typem a jego obszarem nazw zdefiniowany jest w polu BCL w polu Type.Delimiter. Ta wartość będzie używana w interfejsach API Reflection i może być niezawodnie używana do łączenia typu i jego przestrzeni nazw.

1

Zgodnie z tym, gdzie it's used w źródłach odniesienia, @ Paul's Type.Delimiter jest odpowiedzią na główne pytanie, ale odpowiedź na Twoje pytanie, np. jest tak, '.', a także '+', jak wspomniano w odpowiedzi @ Marca, jest hard coded.