我在书中发现有关编程异步应用程序的代码如下:
public static double ReadDataFromIO() {
// We are simulating an I/O by putting the current thread to sleep.
Thread.Sleep(2000);
return 10d;
}
public static Task<double> ReadDataFromIOAsync() {
return Task.Run(new Func<double>(ReadDataFromIO));
}
此代码编译没有错误,效果很好。但是,我想检查在这里使用了Task.Run(MSDN - Task.Run)的重载方法,并且没有找到任何方法。
此外,Visual Studio表明:
Task.Run<double>(Func<double> function)
被使用。
怎么可能?
答案 0 :(得分:4)
如果你的意思是沉默<double>
- 这是通用参数推断,它通常在C#中发生。基本上,如果你没有指定任何泛型类型参数,而如果没有完全非泛型匹配,那么编译器将尝试考虑到所有可用的重载,代表您推导出参数。在这种情况下,它知道(来自静态分析)Func<double>
返回double
允许它使用<double>
推断出最适用的选项Task<TResult> Task.Run<TResult>(Func<TResult>)
。过载。
如果无法推断出所有的通用参数,或者它无法为合适的重载找到一组合适的明确选项,它就会放弃并告诉您自己指定它们。 / p>