在调试模式下无法访问匿名类型的属性(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)的主要内容,如果未能解决你的问题,请参考以下文章