6

In questa console campione app:Impossibile accedere alla proprietà di tipo anonimo in modalità debug (VS2013)

class Program 
{ 
    static void Main() 
    { 
     DoAsyncFoo(); 
     Console.ReadKey(); 
    } 

    private static async void DoAsyncFoo() 
    { 
     var task = CollectStatsAsync(); 
     dynamic foo = await task; 
     Console.WriteLine(foo.NumberOfCores); 
    } 

    private static async Task<dynamic> CollectStatsAsync() 
    { 
     return CollectStats(); 
    } 

    private static dynamic CollectStats() 
    { 
     return new { NumberOfCores = 3 }; 
    } 
} 

Quando ho messo a punto di interruzione

Console.WriteLine (foo.NumberOfCores)

e valutare foo.NumberOfCores in modalità debug, l'uscita dell'errore è:

collectedStats.NumberOfCores 'oggetto' non contiene una definizione di ' NumberOfCores' e 'NumberOfCores' nessun metodo estensione accettare un primo argomento di tipo 'oggetto' potrebbe essere trovato (che le manca un direttiva using o un insieme riferimento?)

Perché collectedStats è "Oggetto Anonimo", non "dinamico". Tuttavia, la funzione ritorna dinamica e l'ho assegnata come dinamica.

valutazione è successo per:

((dynamic)foo).NumberOfCores; 

A proposito, ho capito che se scrivo la funzione in modo sincrono, debugger può tornare direttamente il risultato. Quindi dovrebbe essere async.

Nota: E ho anche provato a restituire Expando Object invece di Anonymous Type dalla funzione, il risultato è lo stesso.

+0

@AlexeiLevenkov non è in un altro assembly. – skynyrd

+0

@CodeCaster no, ho già provato a restituire l'oggetto expando e lo collegherò alla domanda. – skynyrd

+1

@skynyrd ok. Ora è chiaro che [dynamic non contiene una definizione per una proprietà da un riferimento di progetto] (http://stackoverflow.com/questions/9416095/dynamic-does-not-contain-a-definition-for-a-property -from-a-project-reference) non è duplicato a causa del codice nello stesso assembly. –

risposta

0

FYI ho appena provato questo in VS 2013 SP4 e ha funzionato senza alcun problema ...

Ti hanno SP4 applicato? probabilmente non questo, ma vale la pena escludere. Come non ho avuto problemi.

Codice stanco senza problema.

public class Program 
{ 
    static void Main() 
    { 
     DoAsyncFoo(); 
     Console.ReadKey(); 
    } 

    private static async void DoAsyncFoo() 
    { 
     var task = CollectStatsAsync(); 
     dynamic foo = await task; 
     Console.WriteLine(foo.NumberOfCores); 
    } 

    private static async Task<dynamic> CollectStatsAsync() 
    { 
     return CollectStats(); 
    } 

    private static dynamic CollectStats() 
    { 
     return new { NumberOfCores = 3 }; 
    } 
}