错误的(?)返回类型的重载方法Task.Run

时间:2014-04-15 12:27:50

标签: c# generics task-parallel-library

我在书中发现有关编程异步应用程序的代码如下:

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)

被使用。

怎么可能?

1 个答案:

答案 0 :(得分:4)

如果你的意思是沉默<double> - 这是通用参数推断,它通常在C#中发生。基本上,如果你没有指定任何泛型类型参数,而如果没有完全非泛型匹配,那么编译器将尝试考虑到所有可用的重载,代表您推导出参数。在这种情况下,它知道(来自静态分析)Func<double>返回double允许它使用<double>推断出最适用的选项Task<TResult> Task.Run<TResult>(Func<TResult>)。过载。

如果无法推断出所有的通用参数,或者它无法为合适的重载找到一组合适的明确选项,它就会放弃并告诉您自己指定它们。 / p>