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

Tom*_*n89 26 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
}
Run Code Online (Sandbox Code Playgroud)

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

当我打电话时Task.Run,CacheExternalData我会认为编译器很清楚该方法没有返回a Task并且应该解析为Action

小智 29

应该很清楚,但语言规范从未说过不匹配的返回类型会在重载解析期间产生任何影响.正因为如此,没有规则说喜欢ActionFunc<Task>.如果Action被挑选,当然,它会起作用.如果Func<Task>被选中,那么肯定,你会收到一个错误.但要选择其中之一,重载决策必须成功,并且不考虑这一点.

这应该用C#7.3中的新重载分辨率来修复.

  • 确认:是的,它固定在7.3; 将`<LangVer> 7.3 </ LangVer>`添加到测试项目中使其正确解析 (9认同)