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,结果是一样的.
仅供参考,我刚刚在 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)