2013-02-14 9 views

risposta

15

In sostanza: la specifica del linguaggio, ma in realtà, Type.FullName utilizza le definizioni BCL, non i C# definizioni - ed è interessante notare loro disaccordo?.. per esempio:

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

per C#, Z è X.Y.Z, al BCL è X.Y+Z la rappresentazione di farmaci generici cambia troppo - con la BCL tramite back-t. cazzi e numeri anziché parentesi angolari. I credo il BCL utilizza il formato dei tipi della CLI (che ha una specifica separata), ma se ci pensate: non è richiesto di farlo (tranne che durante reflection-emit).

AFAIK, questi separatori non sono esposti tramite nulla come Path.PathSeparator - ma è, come dici tu, codificato in modo fisso nelle classi Type ecc.

+0

Penso che la notazione 'X.Y + Z' possa essere vista per i tipi anonimi e nelle tracce dello stack ...? –

+0

@ThorstenDittmar in termini di C#, tipi anonimi * non hanno mai un nome *. Il compilatore genera nomi che sono illegali in C# - cose come '<> _ 4' (ecc.). Vedrai tale notazione solo per i tipi anonimi se guardi il loro nome BCL, forse tramite '.GetType()' - ma non è poi così diverso da guardare ad un tipo regolare come 'X.Y + Z'. In termini di tracce dello stack: sì, utilizzerà la rappresentazione interna dei tipi: perché ancora una volta, non è il compilatore in esecuzione a quel punto, quindi la terminologia C# non si applica. Allo stesso modo, 'int' di solito sarà' System.Int32' ecc. –

5

Il delimitatore tra un tipo e il relativo spazio dei nomi è definito nel BCL nel campo Type.Delimiter. Vedrai questo valore utilizzato nelle API di Reflection e può essere utilizzato in modo affidabile per concatenare un tipo e il suo spazio dei nomi.

1

In base a dove it's used nelle origini di riferimento, @ Paul's Type.Delimiter è la risposta alla tua domanda principale, ma la risposta al tuo e.g. è sì, '.', così come '+', come menzionato nella risposta di @ Marc, è hard coded.