【问题标题】:Why is the call ambiguous? 'Task.Run(Action)' and 'Task.Run(Func<Task>)'为什么通话模棱两可? 'Task.Run(Action)' 和 'Task.Run(Func<Task>)'
【发布时间】:2018-08-14 09:08:21
【问题描述】:

考虑以下代码:

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) 不是

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

【问题讨论】:

    标签: c# task


    【解决方案1】:

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

    这应该是修复with new overload resolution in C# 7.3

    【讨论】:

    • 确认:是的,在 7.3 中已修复;将&lt;LangVer&gt;7.3&lt;/LangVer&gt; 添加到测试项目使其正确解析
    • 这是规范中非常明显的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多