Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有动作和Func参数的模糊性_C#_Delegates_Task Parallel Library_Ambiguity - Fatal编程技术网

C# 带有动作和Func参数的模糊性

C# 带有动作和Func参数的模糊性,c#,delegates,task-parallel-library,ambiguity,C#,Delegates,Task Parallel Library,Ambiguity,这个代码怎么可能 TaskManager.RunSynchronously<MyObject>(fileMananager.BackupItems, package); “模棱两可”的方法是 static class TaskManager { public static void RunSynchronously<TInput>(Action<TInput> task, TInput param) { Task.Factor

这个代码怎么可能

TaskManager.RunSynchronously<MyObject>(fileMananager.BackupItems, 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;
    }
}
静态类任务管理器
{
公共静态void同步运行(操作任务,TInput参数)
{
Task.Factory.StartNew(()=>Task(param));
}
公共静态布尔同步运行(Func任务,TInput参数)
{
返回Task.Factory.StartNew(()=>Task(param)).Result;
}
}
在我看来,这些方法之间有很大的区别。我错过了什么

编辑:


除了公认的答案之外,我刚刚在一个类似的问题中找到了一个解决方案。这是一个问题。

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

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

RunSynchronously<bool>(x =>
{
}, true);
var r=RunSynchronously(x=>
{
返回true;
},对);
同步运行(x=>
{
},对);

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

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

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

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);
TaskManager.RunSynchronously(
x=>fileMananager.BackupItems(x),包);
TaskManager.RunSynchronously(
(操作)fileMananager.BackupItems,包);
TaskManager.RunSynchronously(
新操作(fileMananager.BackupItems),包);

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

现在对此的另一种可能解释是:

代码是为C#版本7.3编写的(默认情况下由MSBuild 16.x使用,对应于VS2019),但尝试使用早期版本的C#(这是MSBuild 15.x的默认版本,对应于VS2017)


早期版本的C#会抛出此错误,但重载在C#7.3中得到了正确解决。

这对所有方法都有效还是只对lambdas有效?@AlessandroD'Andria:你到底是什么意思?我没意识到这一点。有没有办法设计我的
TaskManager.RunSynchronously
方法,这样我就不需要显式转换了?@OndrejJanacek:现在,我不知道该怎么做,对不起。@DanielHilgarth好吧,这不是这个问题的主题。但是如果你遇到了一个解决方案,请更新你的答案并让我知道。顺便问一下,当
应该是参数时,第一个解决方案中的神奇变量
x
代表什么?当您说“抛出异常”时,您的意思是“导致编译错误”?单击“是”,您是对的。对不起,我误导了你。谢谢你,我编辑了这篇文章。你可以用
x=>true
代替
x=>{return true;}
var r = RunSynchronously<bool>(x =>
{
    return true;
}, true);

RunSynchronously<bool>(x =>
{
}, true);
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);