2013-08-05 10 views
22

Ho cercato un codice in un debugger associato al motore Razor View e ho notato che alcuni tipi appaiono in Debugger con un carattere punto finale alla fine del nome del tipo ad esempio:Cosa indica il punto finale su un tipo C#?

{Nancy. ViewEngines.Razor.RazorViewEngine.}

Qualcuno sa cosa indica questo? Non è valida la sintassi per usarlo quando si specifica un cast su un oggetto, quindi sono incuriosito da ciò che indica all'interno del debugger.

EDIT: Come richiesto dal @Damien_The_Unbeliever, screenshot della variabile nel debugger:

Debug Image

E il codice che sto guardando:

public TCompiledView GetOrAdd<TCompiledView>(
      ViewLocationResult viewLocationResult, Func<ViewLocationResult, TCompiledView> valueFactory) 
     { 
      TCompiledView compiledView = default(TCompiledView); 
      compiledView = (TCompiledView)this.cache.GetOrAdd(viewLocationResult, x => valueFactory(x)); 

Per dare un Un po 'più di background, stiamo cercando di aggiungere il logging alla nostra Nancy View Cache per indagare su un problema intermittente con Razor Views che genera errori di compilazione, ma questo non è davvero rilevante per la ricerca ionico.

+0

Questa libreria genera automaticamente il codice. System.CodeDom è visibile, forse alcuni Reflection.Emit da qualche parte e tu sei a metà strada verso una spiegazione. Basta presentare una segnalazione di bug con [il progetto] (https://github.com/NancyFx/Nancy/issues). –

+0

Una stupida implementazione di 'ToString()' è la mia ipotesi. Controllalo sul tipo effettivo che puoi vedere nella finestra di controllo. – leppie

+0

@leppie 'ToString' probabilmente fornisce qualcosa come' "Nancy.ViewEngines.Razor.RazorViewEngine + <> c__DisplayClass1" 'o simile. È una classe nidificata '<> c__DisplayClass1' dentro il tipo' RazorViewEngine' nel namespace 'Nancy.ViewEngines.Razor'. Piuttosto che chiamare 'ToString()' il debugger tenta di scrivere una classe esterna seguita da un punto (non un segno più) seguito dal nome della classe interna. Vedi la risposta aggiornata di Damien. –

risposta

12

Ho visto accadere questo quando la variabile/valore è in realtà di un tipo generato dal compilatore (ad esempio per contenere le "variabili locali" catturate da un lambda, async, iteratore, ecc.). Il debugger (in vari punti) sembra non essere in grado di visualizzare il nome effettivo della classe.


E.g. questo programma di esempio:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var p = new Program(); 
     p.DoStuff(); 
    } 

    void DoStuff() 
    { 
     int i = 19; 
     Expression<Func<int>> j =() => i + 10; 
     var k = (((j.Body as BinaryExpression).Left as MemberExpression).Expression as ConstantExpression).Value; 
     Console.ReadLine(); 
    } 
} 

Con un punto di interruzione Console.ReadLine(), troverete il tipo della classe k sembra Program. piuttosto che Program+<>_DisplayClass0


Aggiunta di Jeppe: Questo esempio è una leggera semplificazione di quanto sopra, evitando l'albero delle espressioni. Guarda l'istanza di un delegato Target che sarà un'istanza di una classe generata. Per il confronto guarda anche un tipo di blocco iteratore:

using System; 
using System.Collections.Generic; 

static class Program 
{ 
    static void Main() 
    { 
    int i = 19; // to be captured by lambda, will become field on a generated class 
    Func<int> f =() => i; 
    var target = f.Target; // when debugging type looks like "Program." 
    Console.WriteLine(target.GetType().ToString()); // writes "Program+<>c__DisplayClass1" 

    var seq = GetSeq(); // when debugging type looks like "Program.GetSeq" 
    Console.WriteLine(seq.GetType().ToString()); // writes "Program+<GetSeq>d__3" 
    } 

    static IEnumerable<int> GetSeq() // returns "state machine" (iterator block) 
    { 
    yield return 42; 
    } 
} 
+0

Quindi stai dicendo che il vero nome del tipo è in realtà 'Nancy.ViewEngines.Razor.RazorViewEngine.STRANGE_CHARS_HERE', ma a causa di un bug tutto ciò che viene mostrato è' Nancy.ViewEngines.Razor.RazorViewEngine.? –

+1

@JeppeStigNielsen - questo è quello che ho visto - ad es. se il nome del tipo è '<> displayClass1', un valore di quel tipo mostra solo il nome dello spazio dei nomi nella colonna type. Certo, è un po 'difficile ottenere istanze di questo tipo, e senza l'OP che mostra più codice non sapremo se questo è il caso reale qui. Sfortunatamente, generare una breve demo del problema è anche complicato. –

+0

Cercherò di trovare il tempo oggi per entrare in un debugger e fare uno screenshot di quello che sto vedendo, guardare questo spazio ... –

Problemi correlati