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