【问题标题】:Cannot access to property of anonymous type in debug mode (VS2013)在调试模式下无法访问匿名类型的属性(VS2013)
【发布时间】:2015-12-13 05:53:41
【问题描述】:

在此示例控制台应用中:

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

当我将断点设置为

Console.WriteLine(foo.NumberOfCores)

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

collectedStats.NumberOfCores 'object' 不包含定义 对于 'NumberOfCores' 并且没有扩展方法 'NumberOfCores' 接受 可以找到“对象”类型的第一个参数(您是否缺少 使用指令还是程序集引用?)

因为collectedStats 是“匿名对象”,而不是“动态”。但是,该函数返回动态,我将其分配为动态。

评估成功:

((dynamic)foo).NumberOfCores;

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

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

【问题讨论】:

  • @AlexeiLevenkov 它不在另一个程序集中。
  • @CodeCaster 不,我已经尝试返回 expando 对象,我会将其附加到问题中。
  • @skynyrd 好的。现在很明显dynamic does not contain a definition for a property from a project reference 不是重复的,因为代码在同一个程序集中。
  • Cannot reproduce。请创建一个minimal reproducible example。您是否通过 WCF 或其他方式执行此调用(确实意味着 CollectStats 实现在另一个程序集中)?
  • @CodeCaster 我意识到它只发生在调试模式下,然后我编辑了我的问题。这是示例代码ideone.com/CLpHa9,如果你在第 19 行设置断点,并在 VS2013 QuickWatch 屏幕中评估 foo.NumberOfCores,你会看到。

标签: c# asynchronous dynamic visual-studio-2013 anonymous-methods


【解决方案1】:

仅供参考,我刚刚在 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 };
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多