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

Posted

技术标签:

【中文标题】在调试模式下无法访问匿名类型的属性(VS2013)【英文标题】:Cannot access to property of anonymous type in debug mode (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,你会看到。 【参考方案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 ;
    

【讨论】:

以上是关于在调试模式下无法访问匿名类型的属性(VS2013)的主要内容,如果未能解决你的问题,请参考以下文章

VS2013无法启动IIS调试,被拒绝访问

使用VS2013调试C语言时出错,连简单的Hello World都报错,调试时显示无法启动程序,无法访问

VS2013无调试信息

C#“动态”无法访问在另一个程序集中声明的匿名类型的属性

使用 mfc 的 EXE(调试)无法在其他 PC 上运行

vs2013调试程序无法结束进程怎么办?