【发布时间】: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