Action和Func参数的歧义

这段代码怎么可能

TaskManager.RunSynchronously(fileMananager.BackupItems, package); 

导致编译错误

 The call is ambiguous between the following methods or properties: 'TaskManager.RunSynchronously(System.Action, MyObject)' and 'TaskManager.RunSynchronously(System.Func, MyObject)' 

当行动的签名是

 public void BackupItems(MyObject package) 

和“暧昧”的方法是

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

在我看来,这些方法之间存在很大差异。 我在这里想念的是什么?

编辑:

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

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

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

 TaskManager.RunSynchronously( x => fileMananager.BackupItems(x), package); TaskManager.RunSynchronously( (Action)fileMananager.BackupItems, package); TaskManager.RunSynchronously( new Action(fileMananager.BackupItems), package); 

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

我遇到了同样的问题,解决方案是:

 var r = RunSynchronously(x => { return true; }, true); RunSynchronously(x => { }, true); 

现在,为什么编译器不能这样做???