6

W tej aplikacji konsoli próbki:nie można uzyskać dostępu do właściwości anonimowego typu w trybie debugowania (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 }; 
    } 
} 

Kiedy kładę przerwania do

Console.WriteLine (foo.NumberOfCores)

i oceny foo.NumberOfCores w trybie debugowania, wyjście błędu jest:

collectedStats.NumberOfCores „obiekt” nie zawierają definicji dla „NumberOfCores” i „NumberOfCores” no metodę rozszerzenia akceptujących pierwszego argumentu typu „obiektu” można odnaleźć (czy brakuje using dyrektywa lub zespół numer referencyjny?)

Ponieważ collectStats to "obiekt anonimowy", a nie "dynamiczny". Jednak funkcja zwraca wartość dynamiczną i przypisałem ją jako dynamiczną.

Ewaluacja jest udany dla:

((dynamic)foo).NumberOfCores; 

Nawiasem mówiąc, ja sobie sprawę, że jeśli piszę funkcji synchronicznie, debugger może bezpośrednio zwrócić wynik. Więc powinno to dotyczyć asynchronizacji.

Uwaga: Próbowałem również zwracać obiekt Expando zamiast funkcji Anonymous z funkcji, wynik jest taki sam.

+0

@AlexeiLevenkov nie znajduje się w innym zespole. – skynyrd

+0

@CodeCaster nie, już próbowałem zwrócić obiekt expando i dołączę go do pytania. – skynyrd

+1

@skynyrd ok. Teraz jest jasne, że [dynamiczny nie zawiera definicji właściwości z projektu referencyjnego] (http://stackoverflow.com/questions/9416095/dynamic-does-not-contain-a-definition-for-a-property -from-a-project-reference) nie jest duplikatem, ponieważ kod znajduje się w tym samym zespole. –

Odpowiedz

0

FYI właśnie przetestowane w VS 2013 SP4 i działało bez problemu ...

Czy złożyłeś SP4? prawdopodobnie nie to, ale warto wykluczyć. Ponieważ nie miałem żadnych problemów.

Kod i zmęczony bez numeru.

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 }; 
    } 
}