为什么通话不明确? 'Task.Run(Action)'和'Task.Run(Func <task>)'

时间:2018-08-14 09:08:21

标签: c# task

考虑以下代码:

public void CacheData()
{
    Task.Run((Action)CacheExternalData);
    Task.Run(() => CacheExternalData());

    Task.Run(CacheExternalDataTask);

    Task.Run(CacheExternalData);
}

public Task CacheExternalDataTask()
{
    // Long running code
    return Task.FromResult("Data");
}

public void CacheExternalData()
{
    // Long running code
}

为什么Task.Run(CacheExternalData) 模棱两可Task.Run(CacheExternalDataTask)不是 吗?

当用Task.Run调用CacheExternalData时,我认为编译器很清楚方法不会返回Task,它应该解析为Action

1 个答案:

答案 0 :(得分:28)

应该清楚,但是语言规范从未说过不匹配的返回类型在重载解析期间会产生任何影响。因此,没有规则说Action胜过Func<Task>。如果选择Action,那肯定可以。如果选择Func<Task>,那么肯定会出现错误。但是选择其中一种,重载解析必须成功,并且没有考虑到这一点。

这应该是固定的with new overload resolution in C# 7.3