在调试模式下无法访问匿名类型的属性(VS2013)

sky*_*yrd 6 c# asynchronous dynamic anonymous-methods visual-studio-2013

在此示例控制台应用中:

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 };
    }
}
Run Code Online (Sandbox Code Playgroud)

当我把断点放到

Console.WriteLine(foo.NumberOfCores)

并在调试模式下评估foo.NumberOfCores,错误的输出是:

gatherStats.NumberOfCores'对象'不包含'NumberOfCores'的定义,并且没有扩展方法'NumberOfCores'接受类型'object'的第一个参数可以找到(你是否缺少using指令或汇编引用?)

因为gatherStats是"匿名对象",而不是"动态".但是,该函数返回动态,我将其指定为动态.

评估成功:

((dynamic)foo).NumberOfCores;
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我已经意识到如果我同步编写函数,调试器可以直接返回结果.所以它应该是异步的.

注意:我也尝试从函数返回Expando Object而不是Anonymous Type,结果是一样的.

Sea*_*kit 0

仅供参考,我刚刚在 VS 2013 SP4 中对此进行了测试,它工作正常,没有问题......

你有应用SP4吗?可能不是这个,但值得排除。因为我没有任何问题。

代码我累了没有问题。

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 };
    }
}
Run Code Online (Sandbox Code Playgroud)