Action和Func参数的歧义

Ond*_*cek 17 c# delegates ambiguity task-parallel-library

这段代码怎么可能

TaskManager.RunSynchronously<MyObject>(fileMananager.BackupItems, package);
Run Code Online (Sandbox Code Playgroud)

导致编译错误

The call is ambiguous between the following methods or properties:
'TaskManager.RunSynchronously<MyObject>(System.Action<MyObject>, MyObject)' and
'TaskManager.RunSynchronously<MyObject>(System.Func<MyObject, bool>, MyObject)'
Run Code Online (Sandbox Code Playgroud)

当行动的签名是

public void BackupItems(MyObject package)
Run Code Online (Sandbox Code Playgroud)

和"暧昧"的方法是

static class TaskManager
{
    public static void RunSynchronously<TInput>(Action<TInput> task, TInput param)
    {
        Task.Factory.StartNew(() => task(param));
    }

    public static bool RunSynchronously<TInput>(Func<TInput, bool> task, TInput param)
    {
        return Task.Factory.StartNew(() => task(param)).Result;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这些方法之间存在很大差异.我在这里错过了什么?

编辑:

除了接受的答案,我刚刚遇到了类似问题的解决方案.这是链接.

Dan*_*rth 21

原因是方法的返回类型不是其签名的一部分.因此,在解析正确的重载时,编译器只查看方法的参数.

最简单的解决方案是不使用隐式方法组转换.以下所有编译:

TaskManager.RunSynchronously<MyObject>(
    x => fileMananager.BackupItems(x), package);

TaskManager.RunSynchronously<MyObject>(
    (Action<MyObject>)fileMananager.BackupItems, package);

TaskManager.RunSynchronously<MyObject>(
    new Action<MyObject>(fileMananager.BackupItems), package);
Run Code Online (Sandbox Code Playgroud)

第一个是它们中最优雅的,但它也是唯一一个具有 - 轻微 - 运行时性能影响的因为额外的重定向.但是,这种影响是如此之小,以至于你实在不应该在乎.