这段代码怎么可能
TaskManager.RunSynchronously<MyObject>(fileMananager.BackupItems, package);
导致编译错误
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)'
当行动的签名是
时public void BackupItems(MyObject package)
和“模棱两可”的方法
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;
}
}
在我看来,这些方法之间存在很大差异。我在这里缺少什么?
修改
除了接受的答案,我刚刚遇到了类似问题的解决方案。这是link。
答案 0 :(得分:18)
原因是方法的返回类型不是其签名的一部分。因此,在解析正确的重载时,编译器只查看方法的参数。
最简单的解决方案是不使用隐式方法组转换。以下所有编译:
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);
第一个是它们中最优雅的,但它也是唯一一个具有 - 轻微 - 运行时性能影响的因为额外的重定向。但是,这种影响是如此之小,以至于你实在不应该在意。
答案 1 :(得分:1)
当今对此的另一个可能解释是:
该代码是为C#版本7.3编写的(MSBuild 16.x默认使用,对应于VS2019),但是尝试使用早期版本的C#(MSBuild 15.x的默认版本,对应于VS2019)进行构建。 VS2017)。
早期版本的C#会引发此错误,但是在C#7.3中可以正确解决重载。
答案 2 :(得分:0)
我遇到了同样的问题,解决方案是:
var r = RunSynchronously<bool>(x =>
{
return true;
}, true);
RunSynchronously<bool>(x =>
{
}, true);
现在,为什么编译器不能这样做?